如何在构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的定义,这应该明确地表明:
漂亮的图片还列出了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
我想我们都同意单引号的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