转义序列是按顺序还是在JSON中同时转义?

时间:2017-03-27 10:20:51

标签: json

想象一下,我希望文字字符串“\ 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}})?

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。)