这是我的绳子
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仅使用双引号,而不使用单引号,请参阅json.org
-
RFC 4627声明解析器必须能够解析符合JSON的规范(第4段),并且可能支持其他非JSON扩展。但是,第5段着重指出,所有生产者(生成器)必须仅生产100%兼容的JSON。用不需要转义的框架字符生成JSON是一个特别糟糕的主意。请考虑将引号替换为引号。 ietf.org/rfc/rfc4627.txt
-
@ Luv2code尽管您的观点仍然正确,但请注意,您引用的是过时的规范。阅读RFC时,请始终使用tools.ietf.org/html版本,而不是文本版本。 HTML版本更易于阅读并链接到其子部分,最重要的是,HTML版本的顶部是所有后续RFC的列表,这些RFC更新或淘汰了您所读的内容。如果您转到tools.ietf.org/html/rfc4627,则会发现RFC 4627已过时,并已由RFC 7159取代。
-
对于以后阅读此书的人们,RFC 7159已被tools.ietf.org/html/rfc8259淘汰。
-
相关文章-JSON密钥是否必须用引号引起来?
对于这样一个关于基本主题的备受关注的问题,存在高度支持的错误信息,我感到震惊。
JSON字符串不能用单引号引起来。规范的各种版本(Douglas Crockford的原始版本,ECMA版本和IETF版本)都声明必须用双引号将字符串引起来。这不是理论问题,也不是目前公认的答案所引起的见解。如果您尝试让现实世界中的任何JSON解析器解析单引号字符串,都会出错。
Crockford和ECMA的版本甚至使用漂亮的图片显示字符串的定义,这应该清楚地说明这一点:
漂亮图片还列出了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.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中)都抛出异常。您认为使用这些构造"有效"的依据是什么呢?
-
@MarkAmery我同意您的观点,但我认为您不正确地认为\是非法字符。 RFC 4627" 2.5字符串"指出,"任何字符都可以转义。"就是说,这并不意味着它是一个好主意。就像正则表达式一样,您会在字符类中看到转义的句号,美元等,或者转义的右括号。它有效,但是其模棱两可和令人困惑。与正则表达式中的多余转义一样,Id建议"不要在不需要的地方转义JSON",因为总有一天它可能是一个确实具有特殊含义的新元序列,那么您的文档就不一致了。
-
@ Luv2code有趣的报价。您误解了它;这并不意味着任何字符都可以通过在其前面加上反斜杠来转义。更完整的引用是"任何字符都可以转义。如果该字符在基本多语言平面中(U + 0000到U + FFFF),则可以表示为六个字符的序列。...或者,有两个-某些流行字符的字符序列转义表示。" (强调我的)。俗话说,您可以将转换为\u0027,而不是可以将其转换为\。
-
@ Luv2code仍然是,这确实意味着我赞成的评论指出"您无法逃避"(并将这种行为与谋杀儿童相提并论!)在技术上是错误的;更准确的说是您可以逃脱它,而不仅仅是\。我还没有意识到规范的RFC版本将诸如\u0027之类的序列称为转义它们所代表字符的一种方式。但是,\非法的要点仍然是真实且重要的。
-
@MarkAmery是的,先生,您是对的。我误解了"转义"作为反斜杠转义序列。我确实了解 uXXXX表示法,但只是没有意识到它被称为"转义"。在我的代码中,Ive使用 uXXXX表示符"转义"了不是两个字节 C序列之一的任何0x00-0x1F。 (即使已知它具有常见的反斜杠表示形式,例如 0空值, a警报[aka铃声], v垂直制表符等),那么是否应该删除我的错误注释,以免使任何人感到困惑?还是您宁愿我没有那样做,而让您的评论"悬而未决"?
-
@ Luv2code顺其自然-它很有用,因为我之前的评论之一确实存在错误。在理想的世界中,有一些方法可以使我们整理此注释线程,而又不破坏信息,但是没有办法了,所以请拧紧它。
-
@MarkAmery,我对您的注释JSON.parse("foo")感到困惑,您的意思是没有单引号的JSON.parse("foo")是有效的json对象吗?我一直认为,图表开始处的两条垂直线表示扩展了部分信息。是不是有效的json对象应该包含在[]或{}中?
-
@AaA因此,如果精确地讲术语,"foo"不是有效的JSON对象,因为JSON对象是键到括号中包含的值(如{"foo":"bar","qux":7})的映射。但是JSON解析器目前仅限于解析编码的对象。而是解析包含任何序列化JSON值的JSON文本,其中值可以是对象,数组,数字,字符串,true,false或null。 "foo"是有效的JSON字符串,因此也是有效的JSON文本。
-
@AaA并非总是如此;如链接规范中所提到的,该规范的早期版本规定JSON文本中的顶级值必须是对象或数组。因此,遵循规范的旧版本的JSON解析器的实现应该愉快地解析文本{},但是如果您要求它仅解析"foo",则会引发错误。但是,这很不方便,因为它只是任意限制了您可以序列化的值集,并迫使您将对象包装在对象或数组中-因此实现经常违反该规则,而最新的规范将其删除。
-
@AaA当然,JSON.parse("foo")仍然应该失败,因为您不是试图解析JSON文本"foo"而是解析JSON文本foo,这不是有效的JSON文本。 JSON.parse("foo")中的双引号仅表示存储无效JSON文本的3个字符的JavaScript字符串的开头和结尾。但是5个字符的JavaScript字符串"foo"是有效的5个字符的JSON文本,其值是3个字符的字符串,并且JSON.parse将正确地解析它并返回JavaScript字符串foo。
-
@AaA回到我的评论中,您要回答的是:与有效的5个字符的JSON文本"foo"不同,5个字符的文本foo不是有效的JSON文本,因此5-字符JavaScript字符串"foo"不能表示有效的JSON文本,因此JSON.parse("foo")失败,这是符合规范的正确行为。这是因为JSON语法不允许字符串用单引号引起来。
-
@AaA粘贴到浏览器JavaScript控制台中的简单表达式,以帮助确认和理解以上所有内容:JSON.parse("foo"),JSON.parse("foo") == foo和JSON.parse("foo")。
-
@MarkAmery,没有关于在JSON定义中不是字符串限定符的论据,您的第二条评论回答了我的问题,即即使.parse可以解析一个json对象,顶级也需要{}或[]字符串到javascript对象(在这种情况下为字符串)
-
感谢您的小哈哈@MarkAmery
每个人都在谈论如何在用'引用的字符串文字中转义'。这里有一个更大的问题:单引号字符串文字不是有效的JSON。 JSON基于JavaScript,但这不是一回事。如果要在JavaScript代码中编写对象文字,可以;如果您实际上需要JSON,则需要使用"。
使用双引号引起来的字符串,您无需转义'。 (如果您确实希望在字符串中输入文字",则可以使用\"。)
-
嗨,您说过用双引号引起来的字符串,您无需转义。敌人的例子,如果我的字符串值是"Members_id" : 4,您是说它不需要转义吗?显然我遇到了一个问题,它给出了错误的编码错误:UTF-8,并且被读取为Member?s。它是手动生成的json文件。
-
JSON字符串文字中的不得转义。 您是否从某个地方复制粘贴了它? 也许它实际上是\u2019,而不是撇号。 我的猜测:有人在MS Word中输入了它,然后将它变成了引号,因为它认为它最了解。 在语法上,要用旧的ASCII字符撇号(,又名\x27,我们一直将其称为"单引号")。 但是,如果还有其他类似的问题,修复字符编码问题还是不错的。 因此,请选择一种字符编码,并将其用于读取和写入。 或使用\u转义。
这些答案中的大多数要么不回答问题,要么在解释上不必要地冗长。
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逃脱之战)。
回答直接问题:
为了安全起见,请用 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
-
-1为参考。 问题是关于JSON的,但是您链接的引用是关于JavaScript的,并列出了在JavaScript中有效的转义序列,例如\。
-
谢谢马克-我真的只是想提出一个替代的角度-取决于谁到达这里可能会觉得有用。 但是,我同意JSON和Javascript的观点-感谢您成为论坛中的Ninja。
我认为我们都同意单引号的json不是真正的json。即便如此,我们仍然需要解决在没有库的情况下在双引号json字符串中转义""的问题。
用""替换每个""是不够的:
用户可以输入输入:
并再次解析失败(请思考为什么)。
而是先将每个替换为(双反斜杠)。
只有这样,才能将每个"替换为"(反斜杠后跟")。
关于AlexB的帖子:
1 2
| \' Apostrophe or single quote
" Double quote |
转义单引号仅在单引号json字符串中有效
转义双引号仅在双引号json字符串中有效
例:
1 2
| 'Bart\'s car' -> valid
'Bart says "Hi"' -> invalid |
-
单引号字符串在JSON中不合法。 JSON不是javascript。 JSON不允许转义单引号。有关JSON语法的非常简单的文档,请参见json.org。
-
downvote-因为单引号json是无效的!