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

时间:2013-10-04 07:50:20

标签: json

这是我的字符串

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

此处消息包含单引号,与JSON中使用的引号相同。我所做的是填写用户输入的字符串,如消息。所以,我需要摆脱那些破坏代码的特殊场景。但除了字符串替换之外,是否有任何方法可以使它们转义但仍允许HTML将它们处理回正确的消息?

11 个答案:

答案 0 :(得分:317)

我对这个关于基本话题这样一个备受关注的问题的高度错误信息的出现感到震惊。

JSON字符串不能用单引号引用。规范的各种版本(Douglas Crockford的the originalthe ECMA versionIETF version)都声明字符串必须用双引号引用。这不是一个理论问题,也不是一个意见问题,正如目前所接受的答案所暗示的那样;如果您尝试解析单引号字符串,现实世界中的任何JSON解析器都会出错。

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

Image showing the definition of a string from the JSON spec

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

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

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

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

答案 1 :(得分:248)

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

答案 2 :(得分:28)

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

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

答案 3 :(得分:7)

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

好的,所以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

希望这有助于某人。

答案 4 :(得分:1)

可能是我来不及参加派对但这会解析/逃避单引号(不想进入解析vs逃脱的战斗)..

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

答案 5 :(得分:0)

我认为我们都同意单引号jsons不是真正的jsons。尽管如此,我们仍然需要解决逃避问题的问题。在双引号json字符串中,在没有库的情况下为我们这样做。

更换每个"用\"是不足够的: 用户可以输入输入: 并再次解析失败(想想为什么)。

相反,首先用\(双反斜杠)替换每个\。 只有这样,才能更换每个"用\" (反斜杠后跟")。

答案 6 :(得分:0)

答案直接问题:
为安全起见,请用\ u + 4-digit-hex-value

替换所需的字符

实施例: 如果你想逃避撇号'替换为\ u0027
    D' Amico成为D \ u0027Amico

NICE REFERENCE: http://es5.github.io/x7.html#x7.8.4

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

答案 7 :(得分:0)

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

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

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

答案 8 :(得分:0)

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

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

\'序列无效。

答案 9 :(得分:0)

使用模板文字...

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

答案 10 :(得分:-8)

关于AlexB的帖子:

 \'  Apostrophe or single quote
 \"  Double quote

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

示例:

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