想象一下,我希望文字字符串“\ u”存储在JSON字符串中。
This answer provides a nice visual overview of escape sequences in JSON,但从图片中不清楚它们是在同一时间还是按顺序转义。
考虑以下JSON:
{
"foo": "a\\u"
}
至少对我来说应该是有效的JSON,其中foo
包含字符串a\u
。
但\u
是Unicode字符的转义序列,通常必须后跟四个十六进制字符。
当我通过Json Parser Online输入相同的JSON时,我认为使用JSON.stringify
会产生以下错误:“\ u必须后跟4个十六进制字符”。
我还尝试在Firefox和Chrome的控制台中键入以下内容:
var json = JSON.stringify(eval("(" + '{"foo": "a\\u"}' + ")"));
两者都会产生Unicode转义序列错误。即使库superobject for Delphi也会产生相同的错误(实际上,它只会引发JSON解析错误)。
查看字符串上的RFC 7159,确实提到了这些转义序列,但没有提及订单。
在我看来,JSON标准不考虑以下序列\\u
,或者至少解析器不能很好地处理它。如果首先转发\\
,则\\u
会变为\u
而\u
将会出错。如果首先转义\u
,则会在它到达\\
之前产生错误。
这是rich text in JSON的一个特别问题,因为\uc1
和\uc2
是RTF中的常见控制序列。有问题的答案并没有涉及这个问题,但这个问题似乎也几乎被抛弃了。
所以理论上的问题是:转义序列是如何(以及如何转义)?
更实际的问题是:除了简单地为\u
或\
提供Unicode序列之外,如何将字符串文字u
放入JSON字符串中(例如{{} 1}})?
答案 0 :(得分:1)
JSON中的转义序列顺序是什么?
从左到右。 \\u
包含字符串 \ u 。
如何将字符串文字\ u转换为JSON字符串?
"\\u"
当我通过Json Parser Online输入相同的JSON时,我认为使用JSON.stringify会产生以下错误:“\ u必须后跟4个十六进制字符”。
这似乎是该工具中的一个错误。
使用浏览器的JSON.parse进行直接解析可以正常工作:
// Note: The slashes have to be escaped to be put in the JS string literal.
var json = `{
"foo": "a\\\\u"
}`;
console.log("JSON is: " + json);
var object = JSON.parse(json);
console.log("String in parsed object is: " + object.foo);
var json = JSON.stringify(eval("(" + '{"foo": "a\\u"}' + ")"));
虽然\
是JSON中的转义字符,但 也是JavaScript字符串文字中的转义字符。
JavaScript解析器会将"a\\u"
转换为 a \ u ,然后再将传递给eval()
,JSON.stringify
将尝试将其解析为JavaScript字符串文字(但是无效的),之前尝试使用100
将其转换为JSON。)