如何在构建 JSON 字符串的过程中转义特殊字符?

这是我的 JSON 字符串

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

这里的消息包含单引号,这与JSON中使用的引号相同。我所做的是从用户输入(如message)填充字符串。我需要转义那些会破坏代码的特殊场景。但是除了字符串替换之外,有没有办法让它们转义,但仍然允许HTML将它们处理回正确的消息?

1019333 次浏览
根据规格, 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字符串中使用双引号。

关于AlexB的帖子:

 \'  Apostrophe or single quote
\"  Double quote

转义单引号仅在单引号json字符串中有效
转义双引号只在双引号json字符串中有效

例子:

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

每个人都在讨论如何在'引用的字符串文本中转义'。这里有一个更大的问题:单引号字符串文字不是有效的JSON。JSON是基于JavaScript的,但这不是一回事。如果你在JavaScript代码中编写对象文字,没问题;如果你真的需要JSON,你需要使用"

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

对于这样一个被高度关注的基本话题,出现了高度赞的错误信息,我感到震惊。

JSON字符串不能用单引号引用。不同版本的规范(Douglas Crockford的最初的ECMA版本IETF版本)都规定字符串必须用双引号括起来。这不是一个理论问题,也不是目前公认答案所暗示的意见问题;如果您试图让它解析单引号字符串,那么现实世界中的任何JSON解析器都会出错。

Crockford和ECMA的版本甚至用漂亮的图片显示了字符串的定义,这应该清楚地说明了这一点:

 JSON规范中字符串定义的图像

这张漂亮的图片还列出了JSON字符串中的所有合法转义序列:

  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u后面跟着四个十六进制数字

请注意,与这里其他一些无意义的答案相反,\'在JSON字符串中从来都不是有效的转义序列。它不需要这样,因为JSON字符串总是双引号。

最后,当编程生成JSON时,你通常不必自己考虑转义字符(当然,当手动编辑一个基于JSON的配置文件时,你会这样做)。相反,使用您的语言所具有的任何原生映射、数组、字符串、数字、布尔和null类型来形成您想要编码的数据结构,然后使用JSON编码函数将其编码为JSON。这样的函数可能内置在你使用的任何语言中,比如JavaScript的JSON.stringify, PHP的json_encode或Python的json.dumps。如果您使用的语言没有内置这样的功能,您可能可以找到一个JSON解析和编码库来使用。如果您只是使用语言或库函数在JSON之间进行转换,那么您甚至不需要知道JSON的转义规则。这是被误导的提问者应该做的。

也许我来的太晚了,但是这将解析/转义单引号(不想陷入解析vs转义的战斗)..

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

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

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 Amery也提出了这个建议,顺便说一句,回答得很好

希望这能帮助到一些人。

直接问题的答案:
为安全起见,将所需字符替换为\u+4位十六进制值

< p >的例子: 如果您想转义撇号'替换为\u0027
D'Amico变成D\u0027Amico

< p >不错的参考: http://es5.github.io/x7.html#x7.8.4 < / p >

< a href = " https://mathiasbynens。Be /notes/javascript-escapes" rel="nofollow noreferrer">https://mathiasbynens.be/notes/javascript-escapes .

使用encodeURIComponent()对字符串进行编码。

如:

var product_list = encodeURIComponent(JSON.stringify(product_list));

你不需要解码它,因为web服务器会自动做同样的事情。

为了在json中允许双引号字符串中使用单引号,你需要双引号。{“X”:“有什么问题”}= = >{“X”:“什么”的问题”}

https://codereview.stackexchange.com/questions/69266/json-conversion-to-single-quotes < a href = " https://codereview.stackexchange.com/questions/69266/json-conversion-to-single-quotes " > < / >

\'序列无效。

使用模板文字…

var json = `{"1440167924916":{"id":1440167924916,"type":"text","content":"It's a test!"}}`;