2013-10-04 411 views
125

这里是我的字符串如何在构建JSON字符串时转义特殊字符?

{ 
    'user': { 
     'name': 'abc', 
     'fx': { 
      'message': { 
       'color': 'red' 
      }, 
      'user': { 
       'color': 'blue' 
      } 
     } 
    }, 
    'timestamp': '2013-10-04T08: 10: 41+0100', 
    'message': 'I'mABC..', 
    'nanotime': '19993363098581330' 
}  

这里的消息中包含单引号,这是一样的JSON使用的报价。我所做的是填充用户输入的字符串,如消息。所以,我需要避开那些破坏代码的特殊场景。但除了字符串替换,有没有什么办法让他们逃跑,但仍然允许HTML将其处理回正确的消息?

+25

JSON只使用双引号,而不是单引号,请参阅http://www.json.org/ –

+2

RFC 4627指出解析器必须能够解析符合的JSON(第4段),并且可能支持其他非JSON扩展。但是,第5段着重指出,所有生产者(发电机)必须仅生产符合100%标准的JSON。生成不需要转义的框架字符的JSON是一个特别糟糕的主意。请考虑用引号替换您的撇号。 https://www.ietf.org/rfc/rfc4627.txt – Luv2code

+3

@ Luv2code虽然您所做的观点仍然正确,但请注意您引用了过时的规范。阅读RFC时,请始终使用https://tools.ietf.org/html版本,而不是文本版本。 HTML版本更易于阅读和链接到小节,最重要的是,在HTML版本的顶部是所有后续RFC更新或过时的列表。如果你去过https://tools.ietf.org/html/rfc4627,你会发现RFC 4627已经过时,并已被[RFC 7159](https://tools.ietf.org/html/rfc7159)。 –

回答

189

根据specs,JSON字符串必须用双引号,因此您不需要转义'
如果您必须在JSON字符串中使用特殊字符,则可以使用\字符将其转义。

查看JSON使用特殊字符的这个名单:

\b Backspace (ascii code 08) 
\f Form feed (ascii code 0C) 
\n New line 
\r Carriage return 
\t Tab 
\" Double quote 
\\ Backslash character 


然而,即使这是完全违背了规范,笔者可以用\'

这是因为:

  • 它违背了规格
  • 它不再视为JSON有效的字符串

但它的工作原理,只要你想与否。

对于新读者,请务必为您的json字符串使用双引号。

+21

*“单引号json字符串”*?这是无稽之谈; JSON中的字符串只能是双引号。例如,在浏览器控制台中尝试'JSON.parse(“'foo'”)'并观察'SyntaxError:Unexpected token''。 JSON规范[非常简单明了](http://json.org/string.gif)。 JSON中没有用于单引号的转义序列,并且JSON字符串不能单引号。 –

+1

虚假信息在这里给出,你至少应该纠正它。 –

+11

即使这个答案的澄清更新是错误的。虽然在技术上是正确的,但是说你*不需要*来逃避''',就像它在技术上是真实的一样,但是误导性地说你在法律上不需要*谋杀儿童。更正确的是说你*不能*逃脱'''。 '\''是非法的转义序列,如果你使用它,那么你的JSON *是无效的JSON *,任何JSON解析器都会窒息。 (当然,JavaScript的'JSON.parse'和Python的'json.loads'都可以。) –

-6

关于AlexB的帖子:

\' Apostrophe or single quote 
\" Double quote 

逃逸单引号仅在单引号JSON字符串有效
转义双引号仅在双引号JSON字符串有效

例如:

'Bart\'s car'  -> valid 
'Bart says \"Hi\"' -> invalid 
+13

单引号字符串在JSON中不合法。 JSON不是JavaScript。 JSON不允许转义单引号。请参阅http://json.org/获取JSON语法的非常简单的文档。 – srm

+2

downvote - 因为单引号jsons无效! – DominikAngerer

20

大家都在谈论如何逃脱'' - 引用的字符串文字。这里有一个更大的问题:单引号字符串文字无效JSON。 JSON基于JavaScript,但它不是一回事。如果你在JavaScript代码中编写对象字面值,那么很好;如果您确实需要JSON,则需要使用"

对于带双引号的字符串,您不需要转义'。 (如果你确实想在字符串中使用字面值",那么你会使用\"。)

250

我对这种高度赞赏的错误信息的存在感到震惊,因为这是一个关于基本主题的高度关注的问题。

JSON字符串不能用单引号引用。该规范的各种版本(Douglas Crockford的the original,the ECMA versionIETF version)都声明必须用双引号引用字符串。这不是一个理论问题,也不是目前所接受的答案的意见问题;如果您试图让它解析单引号字符串,现实世界中的任何JSON解析器都会出错。

Image showing the definition of a string from the JSON spec

漂亮的画面还列出了所有合法的转义序列内的:

Crockford的和ECMA的版本,甚至使用一个漂亮的图片,这将使该点明确无误地显示一个字符串的定义JSON字符串:

  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u其次是四十六进制数字

需要注意的是,违背了nonsens e在这里的其他一些答案中,\'永远不是JSON字符串中的有效转义序列。它不需要,因为JSON字符串总是用双引号。

最后,当你编写生成JSON时(当然你会在手动编辑的时候,比如说一个基于JSON的配置文件),你通常不需要考虑自己逃脱字符。相反,使用您的语言所使用的任何本地映射,数组,字符串,数字,布尔值和空类型来构建要编码的数据结构,然后使用JSON编码函数将其编码为JSON。这样的功能可能内置于您正在使用的任何语言中,如JavaScript的JSON.stringify,PHP的json_encode或Python的json.dumps。如果您使用的是没有内置此类功能的语言,则可能会找到要使用的JSON解析和编码库。如果您只是简单地使用语言或库函数将事物转换为JSON并从中转换,那么您甚至不需要知道JSON的转义规则。这就是这里提出的错误的问题应该做的。

+0

接受的答案缺失\ u和\ /。我认为这个答案更好,应该是公认的答案。 –

-2

我想我们都同意单引号jsons不是真正的jsons。尽管如此,我们仍然需要解决在双引号json字符串内转义的问题,在没有图书馆为我们这样做的情况下。

用“\”替换每个“”不够: 用户可以输入输入:\ 和解析,再次失败(想为什么)

相反,先更换每\与\(双反斜线) 只有这样,每个“与\”替换(反斜杠后跟“)。

1

可能是我太晚了派对,但这将解析/逃脱单引号(不想进入解析VS逃脱战斗)..

JSON.parse("\"'\"") 
4

大多数这些答案要么不回答问题,要么在解释中不必要地冗长。

好吧,所以JSON只使用双引号,我们得到了!

我正在尝试使用JQuery AJAX将JSON数据发布到服务器,然后再返回相同的信息。 在贴出的问题的最佳解决方案,我发现是使用:

var d = { 
    name: 'whatever', 
    address: 'whatever', 
    DOB: '01/01/2001' 
} 
$.ajax({ 
    type: "POST", 
    url: 'some/url', 
    dataType: 'json', 
    data: JSON.stringify(d), 
    ... 
} 

这将逃脱字符为您服务。

这也由Mark阿梅里奥大回答表明BTW

希望这可以帮助别人。

0

这是一个问题,如果你包括在HTML数据(使用EJS模板引擎)文件中的下列方式:

<script> 
    var MY_APP = { data: JSON.parse('<%-JSON.stringify(data)%>'}; 
</script> 

如果数据包含单引号,这将错误,除非你转换'字符串到\'其中由字符串是唯一可能"\\\'"

<script>var BRANCHE = { data: JSON.parse('<%- 
    JSON.stringify(data).replace("'","\\\'")%>')}; 
</script> 

不漂亮,但工程。

+0

警告:这是危险的代码,不应该被任何人使用。如果您要将JSON数据放入脚本标记中,则还需要转义正斜杠,段落分隔符和行分隔符。因此,这对XSS非常脆弱。 – Chris