如何在构建JSON字符串时转义特殊字符?

How to escape special characters in building a JSON string?

这是我的绳子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
    'user': {
        'name': 'abc',
        'fx': {
            'message': {
                'color': 'red'
            },
            'user': {
                'color': 'blue'
            }
        }
    },
    'timestamp': '2013-10-04T08: 10: 41+0100',
    'message': 'I'mABC..',
    'nanotime': '19993363098581330'
}

此处,消息包含单引号,与JSON中使用的引号相同。 我要做的是从用户输入(例如消息)中填充一个字符串。 因此,我需要避免那些破坏代码的特殊情况。 但是,除了字符串替换之外,还有什么方法可以使它们转义,但仍然允许HTML将其处理回正确的消息?


对于这样一个关于基本主题的备受关注的问题,存在高度支持的错误信息,我感到震惊。

JSON字符串不能用单引号引起来。规范的各种版本(Douglas Crockford的原始版本,ECMA版本和IETF版本)都声明必须用双引号将字符串引起来。这不是理论问题,也不是目前公认的答案所引起的见解。如果您尝试让现实世界中的任何JSON解析器解析单引号字符串,都会出错。

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

Image showing the definition of a string from the JSON spec

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

  • \"
  • \\
  • \/
  • \b
  • \f


  • \t
  • \u,后跟四个十六进制数字

请注意,与此处其他答案中的废话相反,\'绝不是JSON字符串中的有效转义序列。不需要这样,因为JSON字符串始终被双引号引起来。

最后,在以编程方式生成JSON时,您通常不必考虑自己对字符进行转义(当然,在手动编辑(例如,基于JSON的配置文件时)您当然会考虑)。而是使用您的语言具有的任何本机映射,数组,字符串,数字,布尔值和null类型来形成要编码的数据结构,然后使用JSON编码功能将其编码为JSON。无论您使用哪种语言(例如JavaScript的JSON.stringify,PHP的json_encode或Python的json.dumps),都可以内置此函数。如果您使用的语言没有内置此类功能,则可能会找到要使用的JSON解析和编码库。如果仅使用语言或库函数来将事物与JSON相互转换,您甚至不需要知道JSON的转义规则。这就是在此误导的提问者应该做的事情。


根据规范,JSON字符串必须双引号,因此您无需转义'
如果必须在JSON字符串中使用特殊字符,则可以使用\字符对其进行转义。

请参阅此JSON中使用的特殊字符列表:

1
2
3
4
5
6
7
8
9
\b  Backspace (ascii code 08)
\f  Form feed (ascii code 0C)

  New line

  Carriage return
\t  Tab
"  Double quote
\\  Backslash character

但是,即使完全违反规范,作者也可以使用\'

这很不好,因为:

  • 这与规格相反
  • 它不再是JSON有效字符串

但是,不管您想要与否,它都可以工作。

对于新读者,请始终对json字符串使用双引号。


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

使用双引号引起来的字符串,您无需转义'。 (如果您确实希望在字符串中输入文字",则可以使用\"。)


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

OK,所以JSON仅使用双引号,我们明白了!

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

1
2
3
4
5
6
7
8
9
10
11
12
var d = {
    name: 'whatever',
    address: 'whatever',
    DOB: '01/01/2001'
}
$.ajax({
    type:"POST",
    url: 'some/url',
    dataType: 'json',
    data: JSON.stringify(d),
    ...
}

这将为您转义字符。

马克·埃默里(Mark Amery)的建议也不错,BTW

希望这对某人有帮助。


为了允许将双引号引起来的双引号包含在json中,请将双引号加倍。 {" X":"问题是什么"} ==> {" X":"问题是什么"}

https://codereview.stackexchange.com/questions/69266/json-conversion-to-single-quotes

序列无效。


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

例如。 var product_list = encodeURIComponent(JSON.stringify(product_list));

您不需要解码它,因为Web服务器会自动执行相同的操作。


可能我参加聚会太晚了,但这将解析/转义单引号(不想陷入解析vs逃脱之战)。

1
JSON.parse(""'"")

回答直接问题:
为了安全起见,请用 u + 4-digit-hex-value替换所需的字符

例:
如果要转义撇号'替换为 u0027
D'Amico成为D u0027Amico

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

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


我认为我们都同意单引号的json不是真正的json。即便如此,我们仍然需要解决在没有库的情况下在双引号json字符串中转义""的问题。

用""替换每个""是不够的:
用户可以输入输入:
并再次解析失败(请思考为什么)。

而是先将每个替换为(双反斜杠)。
只有这样,才能将每个"替换为"(反斜杠后跟")。


关于AlexB的帖子:

1
2
 \'  Apostrophe or single quote
 "  Double quote

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

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

例:

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