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

din*_*707 189 json

这是我的字符串

{
    'user': {
        'name': 'abc',
        'fx': {
            'message': {
                'color': 'red'
            },
            'user': {
                'color': 'blue'
            }
        }
    },
    'timestamp': '2013-10-04T08: 10: 41+0100',
    'message': 'I'mABC..',
    'nanotime': '19993363098581330'
}    
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ery 341

我对这个关于基本话题这样一个备受关注的问题的高度倾斜的错误信息的存在感到震惊.

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,PHP json_encode或Python json.dumps.如果您使用的语言没有内置此类功能,您可能会找到要使用的JSON解析和编码库.如果您只是使用语言或库函数将事物转换为JSON,那么您甚至不需要知道JSON的转义规则.这就是被误导的问题提问者应该做的事情.

  • 我同意这篇文章的暴躁。 (5认同)
  • 4 十六进制 *字节* 或 *半字节*? (3认同)

Ale*_*exB 272

根据规范,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
Run Code Online (Sandbox Code Playgroud)


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

这很糟糕,因为:

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

但是,无论你想要与否,它都有效.

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

  • *"单引号json字符串"*?这是无稽之谈; JSON中的字符串只能是双引号.例如,在浏览器控制台中尝试`JSON.parse("'foo'")`,并观察`SyntaxError:Unexpected token'.关于这一点,JSON规范[非常简单明了](http://json.org/string.gif).JSON中没有针对单引号的转义序列,并且JSON字符串不能单引号. (28认同)
  • 即使对这个答案的所谓澄清更新也是不好的.虽然从技术上讲是正确的,但是说你"不需要"*逃避`'`是很有误导性的,就像它在技术上是正确的一样,但误导你说从法律上说你*不需要谋杀儿童.更正确的是说你*不能逃避`'`.`\'`是一个非法的转义序列,如果你使用它,那么你的JSON*是无效的JSON*,任何JSON解析器都会阻塞它.(当然是JavaScript的`JSON.parse`和Python的`json.loads`.) (15认同)
  • @ Luv2code有趣的引用.你稍微误解了它; 它*并不意味着任何角色都可以通过在它前面放一个反斜杠来逃脱.更全面的引用是"任何字符都可以被转义.如果字符在基本多语言平面(U + 0000到U + FFFF)中,那么它可以表示为***六字符序列***...或者,有两个字符的序列转义表示***一些流行的字符.***"(强调我的).它说你可以逃脱```作为`\ u0027`,*不*你可以把它作为`\'来逃脱它. (10认同)
  • 经过多次编辑后,这个答案仍然完全是胡说八道.你错误地声称,在JSON中使用单引号字符串并使用`\'`escape sequence*"可以正常工作,因为你想要或不"*.这是错误的.我挑战你展示流行使用的*any*JSON解析器,它不会阻塞单引号字符串或`\'`序列.我已经指出`JSON.parse("'foo'")`和`JSON.parse('"\\\''')``(在JavaScript中)和`json.loads("'foo'") `和`json.loads('"\\\'"')`(在Python中)都抛出异常.*对于使用这些结构"有效"的说法,你的基础是什么? (2认同)
  • @ Luv2code仍然,它确实意味着我的赞成评论说"你无法逃脱''`"(并将这种行为与谋杀孩子的行为进行比较!)在技术上是错误的; 更准确的是说你可以逃避它,而不是"\".我没有意识到规范的RFC版本将序列称为"\ u0027",作为"转义"它们所代表的字符的一种方式.然而,"\"非法的关键点仍然是真实而重要的. (2认同)

Dav*_*ipe 32

每个人都在谈论如何'在一个'引用的字符串文字中逃避.这里有一个更大的问题:单引号字符串文字不是有效的JSON.JSON基于JavaScript,但它不是一回事.如果你在JavaScript代码中编写一个对象文字,那很好; 如果你真的需要JSON,你需要使用".

使用双引号字符串,您不需要逃避'.(如果你确实想要"字符串中的文字,你可以使用\".)

  • JSON 字符串文字中的 `'` 不得转义。你是从某处复制粘贴的吗?也许它确实是一个“\u2019”,而不是撇号。我的猜测:有人将其输入 MS Word,后者将其变成引号,因为它认为自己最了解。从语法上来说,传统的 ASCII 字符撇号(`'`,又名 `\x27`,到目前为止我们一直称之为“单引号”)就是您想要的。但是,如果存在其他类似的问题,解决您的字符编码问题仍然是件好事。因此,选择一种字符编码,并将其用于读取和写入。或者使用“\u”进行转义。 (2认同)

Kic*_*ass 8

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

好的,所以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),
    ...
}
Run Code Online (Sandbox Code Playgroud)

这将为你逃脱角色.

Mark Amery也提出了这一点,BTW很棒

希望这有助于某人.