如何在构buildJSONstring中转义特殊字符?

这是我的string

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

这里的消息包含单引号,与JSON中使用的引号相同。 我所做的是从用户input如消息填充string。 所以,我需要逃避那些破坏代码的特殊场景。 但除了stringreplace,有没有办法让他们逃跑,但仍然允许HTML处理他们回正确的消息?

根据规格 ,JSONstring必须用双引号,所以你不需要转义。
如果您必须在JSONstring中使用特殊字符,则可以使用\字符将其转义。

请参阅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有效的string

但是,它的工作,如你所愿。

对于新的读者,请务必为您的jsonstring使用双引号。

对于这样一个关于基本话题的高度关注的问题,我高兴地误以为是错误的信息,我对此感到震惊。

JSONstring不能用单引号引用 。 规范的各种版本(道格拉斯·克罗克福德, ECMA版本和IETF版本 )都声明string必须用双引号引起来。 这不是一个理论问题,也不是目前所接受的答案的意见; 如果您尝试parsing单引号string,现实世界中的任何JSONparsing器都会出错。

克罗克福德和ECMA的版本甚至用一幅美丽的图画来显示一个string的定义,这应该明确地表明:

该图显示了JSON规范中字符串的定义

漂亮的图片还列出了JSONstring中的所有合法转义序列:

  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u后跟四位十​​六进制数字

请注意,与其他答案中的废话相反,在JSONstring中永远不会有效的转义序列。 它不需要,因为JSONstring总是双引号。

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

每个人都在谈论如何在'引用'string文字中转义。 这里有一个更大的问题: 单引号string文字不是有效的JSON 。 JSON基于JavaScript,但并不是一回事。 如果您在JavaScript代码中编写对象字面值,则可以; 如果你真的需要JSON,你需要使用"

用双引号string,你不需要逃避' 。 (如果你确实想要一个string"在string中,你会使用\" 。)

这些答案中的大部分或者不回答这个问题,或者在解释中不必要的冗长。

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

我试图使用JQuery AJAX将JSON数据发布到服务器,然后返回相同的信息。 我发现的最佳解决scheme是使用:

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

这将为你逃脱人物。

Mark Amery也提出了这个build议

希望这有助于某人。

可能是我太晚了,但这会parsing/逃避单引号(不想陷入parsingvs逃脱的战斗)..

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

如果以下列方式将数据包含在html文件中(使用ejs模板引擎),则这是一个问题:

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

如果数据包含带单引号的string,则会出错,除非将string"\\\'"只能转换为' \' "\\\'"

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

不漂亮,但工程。

直接问题的答案是:
为了安全起见,请用\ u + 4位hex值replace所需的字符

例如:如果您想要将撇号replace为\ u0027
D'Amico成为D \ uA27Amico

好参考: http : //es5.github.io/x7.html#x7.8.4

https://mathiasbynens.be/notes/javascript-escapes

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

用“\”代替每个“不够”:用户可以inputinput:\并且parsing再次失败(想一想为什么)。

相反,首先用\(双反斜杠)replace每个\。 只有这样,用“\”(反斜杠后跟“”)replace每个“。

关于AlexB的post:

  \' Apostrophe or single quote \" Double quote 

转义单引号仅在单引号jsonstring中有效
转义双引号仅在双引号jsonstring中有效

例:

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