JSON.stringify和“\ u2028 \ u2029”检查?

时间:2013-05-22 08:12:45

标签: javascript json

有时我在视图源页面(html视图源)中see这段代码:

if (JSON.stringify(["\u2028\u2029"]) === '["\u2028\u2029"]') JSON.stringify = function (a) {
    var b = /\u2028/g,
        c = /\u2029/g;
    return function (d, e, f) {
        var g = a.call(this, d, e, f);
        if (g) {
            if (-1 < g.indexOf('\u2028')) g = g.replace(b, '\\u2028');
            if (-1 < g.indexOf('\u2029')) g = g.replace(c, '\\u2029');
        }
        return g;
    };
}(JSON.stringify);
  • JSON.stringify(["\u2028\u2029"])需要检查的问题是什么?

其他信息:

  • JSON.stringify(["\u2028\u2029"])值为"["

"]"
  • '["\u2028\u2029"]'值也是"["

"]"

3 个答案:

答案 0 :(得分:7)

我认为这可能是一项安全功能。 20282029的FileFormat.info有一个横幅说明

  

请勿在域名中使用此字符。由于可能存在网络钓鱼,浏览器为blacklisting

但事实证明,行和段落分隔符\u2028\u2029分别被视为ES5 JavaScript中的新行。

来自http://www.thespanner.co.uk/2011/07/25/the-json-specification-is-now-wrong/

  

\ u2028和\ u2029可以破坏整个JSON提要的字符,因为该字符串将包含一个新行,并且JavaScript解析器将会挽救

所以你看到了JSON.stringify的补丁。另请参阅Node.js JavaScript-stringify

编辑:是的,现代浏览器的内置JSON对象正确处理此问题。我找不到任何指向实际来源的链接来支持这个。 Chromium code search未提及任何可能需要手动添加此变通方法的错误。看起来Firefox 3.5是第一个拥有本机JSON支持的版本,not entirely虽然没有bug。 IE8也支持它。所以它可能是一个现在不必要的补丁,假设浏览器已正确实现了规范。

答案 1 :(得分:3)

阅读完两个答案后,这里是简单的视觉解释:

这样做

alert(JSON.stringify({"a":"sddd\u2028sssss"})) //可能会导致问题

会提醒:

enter image description here

将问题制定者更改为其他内容(例如从\u更改为\1u

会提醒:

enter image description here

现在,让我们从原来的Q,

调用该函数

让我们再试一次alert(JSON.stringify({"a":"sddd\u2028sssss"}))

结果:

enter image description here

现在,每个人都很高兴。

答案 2 :(得分:1)

\u2028\u2029是不可见的Unicode lineparagraph分隔符。原生JSON.stringify方法将这些代码转换为符号表示(因为JavaScript会自动在字符串中执行),从而生成"["

"]"。您提供的代码不允许JSON将代码转换为符号,并在输出字符串中保留其\uXXXX表示,即返回"["\u2028\u2029"]"