如何在构建JSON字符串时转义特殊字符?
如何在构建JSON字符串时转义特殊字符?
这是我的字符串:\n
{ 'user': { 'name': 'abc', 'fx': { 'message': { 'color': 'red' }, 'user': { 'color': 'blue' } } }, 'timestamp': '2013-10-04T08: 10: 41+0100', 'message': 'I'mABC..', 'nanotime': '19993363098581330' }
\n这里的消息包含单引号,与JSON中使用的引号相同。我的操作是从用户输入中填充一个字符串,比如消息。因此,我需要转义这些特殊情况,以避免代码出错。但是,除了使用字符串替换之外,是否还有其他方法可以使它们转义,同时允许HTML将它们处理回正确的消息?
如何在构建JSON字符串时转义特殊字符?
大家都在讨论如何在一个以单引号'
引用的字符串文字中转义'
。但这里有一个更大的问题:单引号引用的字符串文字不是有效的JSON。JSON基于JavaScript,但它并不完全相同。如果你在JavaScript代码中编写对象文字,那没问题;但如果你真正需要JSON,就需要使用双引号"
。
对于双引号字符串,你不需要转义'
。(如果你确实需要字符串中的一个字面上的"
,你可以使用\"
)。
嗨,你说用双引号字符串,你不需要转义'
。例如,如果我的字符串值是"Member's_id" : 4
,你是说它不需要转义吗?显然,我遇到了一个问题,它报错错误的编码:UTF-8,并且被读取为Member�s
。这是一个手动生成的JSON文件。
在JSON字符串文字中的'
不应该被转义。你是不是从某个地方复制粘贴过来的?也许它实际上是一个\u2019
,而不是一个撇号。我猜测:有人在MS Word中键入它,因为它认为自己最懂。从语法上讲,好老的ASCII字符撇号('
,也称为\x27
,我们一直称之为“单引号”)是你想要的字符。但是为了解决字符编码问题,最好修复一下,以防有其他类似问题。所以选择一个字符编码,并在读取和写入时都使用它。或者使用\u
进行转义。
如何在构建JSON字符串时转义特殊字符?
JSON字符串必须用双引号括起来,根据规范,因此不需要转义'字符。如果您必须在JSON字符串中使用特殊字符,可以使用\字符来转义它。以下是JSON中使用的特殊字符列表:
\b 退格(ascii码08)
\f 换页符(ascii码0C)
\n 换行符
\r 回车符
\t 制表符
" 双引号
\ 反斜杠字符
然而,即使这完全违反了规范,作者也可以使用'。这是不好的,因为:
它与规范相悖
它不再是有效的JSON字符串
但是,不管你喜欢与否,它确实起作用。
对于新读者,始终为您的JSON字符串使用双引号。
"single quoted json strings"? 这是无意义的;JSON中的字符串只能是双引号。例如,在浏览器控制台中尝试JSON.parse("'foo'"),观察到SyntaxError: Unexpected token '<。JSON规范在这方面非常简单和清晰。JSON中没有用于单引号的转义序列,JSON字符串不能被单引号引用。
这里提供了错误的信息,您至少应该进行更正。
即使对于这个答案的所谓澄清更新,也是错误的。虽然从技术上讲是正确的,但是说你“不需要”转义'是具有误导性的,就像说在法律上你“不需要”谋杀儿童一样。更正确的说法是,您不能转义'。'是非法的转义序列,如果您使用它,您的JSON就不是有效的JSON,任何JSON解析器都无法解析它。(JavaScript的JSON.parse和Python的json.loads肯定会出错。)
这是一个改进,当然。但是为什么您不至少删除错误的部分呢?您仍然建议使用'(两次),并且您仍然有一个令人困惑和无关的链接,指向关于javascript的页面。
经过多次编辑后,此答案仍然是一派胡言。您错误地声称,在JSON中使用单引号字符串并使用\转义序列“工作,不管你喜不喜欢”。这是错误的。我要求您展示任何一种在流行使用的JSON解析器中都不会对单引号字符串或\序列引发错误的证据。我已经指出,JSON.parse("'foo'")和JSON.parse('"\\\'"')(在JavaScript中)以及json.loads("'foo'")和json.loads('"\\\'"')(在Python中)都会抛出异常。您凭什么声称使用这些结构“有效”?
我同意您的观点,但我认为您对于'
是否是非法字符的说法是不正确的。RFC 4627“2.5 Strings”指出:“任何字符都可以转义。”也就是说,并不意味着只需在其前面放置反斜杠就可以对任何字符进行转义。更全面的引用是:“任何字符都可以转义。如果字符在基本多语言平面(U+0000到U+FFFF)中,则可以表示为六字符序列。...另外,一些常用字符有两个字符的序列转义表示。”(我强调)。它表明您可以将'作为\u0027进行转义,而不是将其转义为'。
尽管如此,这并不意味着我的受欢迎的评论错误地指出,“你不能转义'
”(并将此行为与杀害儿童相提并论!);更准确的说法是,您可以对其进行转义,但不能将其转义为'
。我之前没有意识到RFC版本的规范将诸如\u0027
之类的序列称为“转义”所表示的字符。然而,'
是非法的关键点仍然是正确而且重要的。
是的先生,您是正确的。我误解了“转义”为反斜杠转义序列。我确实了解到了\uXXXX表示法,但只是没有意识到它被称为“转义”。在我的代码中,我使用\uXXXX表示法对不是两字节\C序列之一的0x00-0x1F进行了“转义”。(即使已知它们具有常见的反斜杠表示形式,例如\0 null,\a alert [又名bell],\v垂直制表符等。)那么,我应该删除我的错误评论以免混淆任何人吗?还是您不希望我这样做,并留下您的评论“悬空”?
让它保持不变-这对于其中一个以前评论中的真正错误非常有用。在理想的世界中,我们将有一些方法来整理这个评论线程,而不会破坏信息,但是现在没有,所以算了吧。
我对您回复的评论有些困惑JSON.parse("'foo'")
是不是意味着JSON.parse("foo")
没有使用单引号是一个有效的JSON对象?我一直认为图表开头的两个竖线表示展开的部分信息。有效的json对象应该包含在[]或{}中吗?
因此,如果我们对术语要求精确,"foo"
不是有效的JSON对象,因为JSON对象是键值对的映射,包含在花括号中,如{"foo":"bar", "qux":7}
。但是JSON解析器不限于解析编码的对象;它们解析包含任何序列化的JSON值的JSON文本,其中值可以是对象、数组、数字、字符串、true、false或null。"foo"
是一个有效的JSON字符串,因此也是一个有效的JSON文本。
这并不总是正确的;如链接的规范中所提到的,先前版本的规范规定JSON文本中的顶级值必须是对象或数组。因此,符合规范的JSON解析器实现应该可以解析文本{}
,但如果您要求其只解析"foo"
,则会引发错误。不过,这很不方便,因为它仅仅任意地限制了您可以序列化的值的集合,并迫使您将内容包装在对象或数组中-因此实现通常违反了该规则,而最新的规范已将其删除。
当然,JSON.parse("foo")
应该仍然失败,因为您在尝试解析JSON文本"foo"
而不是JSON文本foo
,后者不是有效的JSON文本。在JSON.parse("foo")
中的双引号只表示存储无效的JSON文本的3个字符JavaScript字符串的起始和结束。但是5个字符的JavaScript字符串'"foo"'
是一个有效的5个字符的JSON文本,其值是一个3个字符的字符串,JSON.parse
将正确解析它并返回JavaScript字符串'foo'
。
回到我评论的要点,您回复的是,与有效的5个字符JSON文本"foo"
不同,5个字符的文本'foo'
不是有效的JSON文本,因此5个字符的JavaScript字符串"'foo'"
不表示有效的JSON文本,因此JSON.parse("'foo'")
失败,这是正确的,符合规范的行为。这是因为JSON语法不允许使用单引号引用字符串。
为了帮助确认和理解上述所有内容,可以将以下简单表达式粘贴到浏览器的JavaScript控制台中:JSON.parse('"foo"')
,JSON.parse('"foo"') == 'foo'
和JSON.parse("'foo'")
。
在构建JSON字符串时如何转义特殊字符?
我对在一个关于基础主题的高度浏览的问题中存在高投票的错误信息感到震惊。
JSON字符串不能用单引号引用。各种规范版本(Douglas Crockford的原始版本,ECMA版本,和IETF版本)都指出字符串必须用双引号引用。这不是一个理论问题,也不是一个意见问题,正如当前被接受的答案所暗示的那样;如果你尝试解析一个使用单引号的字符串,任何现实世界中的JSON解析器都会报错。
Crockford和ECMA的版本甚至展示了使用漂亮图片的字符串定义,这应该明确无误地说明这一点:
这个漂亮的图片还列出了JSON字符串中所有合法的转义序列:
\"
\\
\/
\b
\f
\n
\r
\t
\u
后跟四个十六进制数字
请注意,与其他答案中的胡言乱语相反,\'
在JSON字符串中永远不是一个有效的转义序列。它不需要是有效的,因为JSON字符串总是用双引号引用的。
最后,当您以编程方式生成JSON时,通常不需要考虑自己转义字符(当然,在手动编辑JSON配置文件时需要)。相反,使用您的语言具有的任何本机的map、array、string、number、boolean和null类型来形成您想要编码的数据结构,然后使用JSON编码函数将其编码为JSON。这样的函数可能已经内置在您使用的任何语言中,比如JavaScript的JSON.stringify
、PHP的json_encode
或Python的json.dumps
。如果您使用的语言没有这样的功能内置,您可能会找到一个JSON解析和编码库来使用。如果您简单地使用语言或库函数将事物转换为JSON,您甚至不需要了解JSON的转义规则。这是这里误导的问题提问者应该做的。
4个十六进制字节还是半字节?
我赞成这篇文章的愤怒之处。