248

这是我的字符串

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

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

4

10 回答 10

419

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

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

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

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

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

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

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

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

于 2014-12-17T01:21:29.647 回答
329

根据规范,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 字符串使用双引号。

于 2013-10-04T07:56:06.387 回答
42

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

使用双引号字符串,您无需转义'. (如果您确实想要"字符串中的文字,则可以使用\".)

于 2014-09-11T21:25:55.983 回答
6

这些答案中的大多数要么没有回答问题,要么解释的时间过长。

好的,所以 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 提出的,BTW 的好答案

希望这可以帮助某人。

于 2016-03-08T12:37:17.733 回答
-1

可能是我参加聚会为时已晚,但这将解析/转义单引号(不想陷入解析与转义的战斗)..

JSON.parse("\"'\"")
于 2016-02-02T02:49:32.863 回答
-1

回答直接问题:
为了安全起见,请将所需字符替换为 \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

于 2017-07-17T06:51:24.943 回答
-1

使用模板文字...

var json = `{"1440167924916":{"id":1440167924916,"type":"text","content":"It's a test!"}}`;
于 2020-06-11T10:01:21.667 回答
-2

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

例如。:

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

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

于 2019-04-29T10:26:21.290 回答
-6

为了 json 的目的,要允许在双引号字符串中使用单引号,请将单引号加倍。{“X”:“问题是什么”} ==> {“X”:“问题是什么”}

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

\' 序列无效。

于 2019-07-27T19:00:24.847 回答
-17

关于 AlexB 的帖子:

 \'  Apostrophe or single quote
 \"  Double quote

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

例子:

'Bart\'s car'       -> valid
'Bart says \"Hi\"'  -> invalid
于 2013-12-04T11:05:33.377 回答