【问题标题】:Are escape sequences escaped in order or simultaneously in JSON?转义序列是按顺序转义还是在 JSON 中同时转义?
【发布时间】:2017-03-27 10:20:50
【问题描述】:

假设我希望将文字字符串“\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(例如a\u005Cu)提供Unicode 序列之外,我如何将字符串文字\u 转换为JSON 字符串?

【问题讨论】:

    标签: json


    【解决方案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() 之前,eval() 将尝试将其解析为 JavaScript 字符串文字(但一个无效的),尝试使用 JSON.stringify 将其转换为 JSON)。

    【讨论】:

    • 你是对的,“\\\\u”通过eval()JSON.stringify() 有效,但是如果我通过JSON Parser Online 尝试该序列,仍然会产生错误。不幸的是,我正在使用的超级对象库也是如此。也许这是这些库中的错误?
    • 回答我自己的评论,似乎超级对象无法正确转义序列。我已经提交了an issue,但我怀疑它会得到修复,所以现在我们正在寻找一个更“hacky”的解决方案。
    • 其实,更糟糕的是,我错了!超级对象确实有效。所以它一定是导致错误的其他东西。只是那个在线工具坏了。
    猜你喜欢
    • 2013-11-30
    • 2020-08-07
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 2021-09-03
    相关资源
    最近更新 更多