json - IE8 原生 JSON.parse 错误导致堆栈溢出

标签 json internet-explorer-8

TL;DR: 将任何非内置函数添加到 Array.prototype AND Function.prototype 将导致 IE8 原生 JSON 解析器在解析任何包含数组的 JSON 时发生堆栈溢出,但仅当您还将 reviver 函数传递给 JSON.parse()。

这开始是一个问题,但我回答了我自己的原始问题,所以现在我要问:任何人都可以想到一个解决这个 IE8 错误的方法,它不涉及消除所有修改 Array.js 的 JS 库。原型(prototype)和Function.prototype?

原问题:

我有大约 13k 的 JSON 数据要解析。数据的结构是一个具有单个值的对象,它是一个嵌套数组。

{ 'value':[[ stuff ], [ more stuff], [ etc ]] }

我正在使用 json2.js,它在可用时遵循浏览器 native JSON.parse。我将 reviver 函数传递给 JSON.parse 以正确处理日期。当 IE8 处于 IE7 仿真模式(导致它使用基于脚本的 json2.js 解析器)时,一切正常。当 IE8 处于 IE8 模式(这会导致它使用浏览器原生 JSON 解析器)时,它会因“堆栈空间不足”错误而爆炸。当然,Firefox 和 Chrome 与它们的浏览器原生 JSON 解析器配合得很好。

我已将其范围缩小为:如果我将一个无操作的 reviver 函数传递给 JSON.parse,IE8 原生解析器就会出现堆栈溢出。如果我没有传入 reviver 函数,IE8 原生解析器可以正常工作,只是它不能正确解析日期。

// no error:
JSON.parse(stuff);

// "out of stack space" error:
JSON.parse(stuff, function(key, val) { return val; });

我将使用我的 JSON 数据,看看是否更少的数据或更少的数据嵌套可以避免错误,但我想知道是否有人以前见过这个,或者有任何其他建议的解决方法。 IE8 已经够慢了,因为这个 bug 而禁用该浏览器的原生 JSON 将是一种耻辱。

更新:在其他情况下,使用不同的 JSON 数据,当我使用带有 reviver 函数的 IE8 native 解析器时,我收到一个 javascript 错误“$lineinfo is undefined”,如果我不使用 reviver 函数,则没有错误。字符串“$lineinfo”没有出现在我的任何源代码中。

更新 2:实际上,这个问题似乎是由 Prototype 1.6.0.3 引起的。在添加到 Prototype 库之前,我无法在隔离的测试页面中重现它。

更新 3:

prototype.js 破坏 IE8 原生 JSON 解析器的原因是:将任何非内置函数添加到 Array.prototype AND Function.prototype 将导致 IE8 原生 JSON 解析器在解析任何 JSON 时出现堆栈溢出包含一个数组,但仅当您还将 reviver 函数传递给 JSON.parse() 时。

Prototype 库将函数添加到 Array.prototype 和 Function.prototype 中,但这同样适用于执行相同操作的任何其他库。 IE JSON 解析器中的这个错误由​​ Prototype 和 Ext 暴露,但不是 jQuery。我没有测试任何其他框架。

这是一个完全独立的问题重现。如果删除 Function.prototype 行或 Array.prototype 行,或从 JSON 字符串中删除数组,则不会出现“堆栈空间不足”错误。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
<script type="text/javascript">

Function.prototype.test1 = function() { };
Array.prototype.test2 = function() { };

window.onload = function()
{
    alert(JSON.parse('{ "foo": [1,2,3] }', function(k,v) { return v; }));
}

</script>
</head>
<body>

</body>
</html>

最佳答案

关于json - IE8 原生 JSON.parse 错误导致堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1288962/

相关文章:

Ajax 应用程序适用于某些浏览器,而不适用于其他浏览器

javascript - XMLHttpRequest/ajax 设置内容类型

iOS SWIFT - NSJSONSerialization 后的 JSON 对象为 nil

javascript - 如何在客户端从服务器(Node JS 和 Express)接收和使用 JSON 对象?

mysql - 如何在 Sequel Pro TEXT 编辑器中创建 JSON 字符串?

json - 有没有办法在 ColdFusion 中转义井号字符 (#)?

css - 我使用 box-shadow css 但它在 IE8 中不起作用

css - html5shiv 不能在 IE8 中工作?

.net - 为什么在IE8中查看时 session cookie只显示DOMAIN的 '.com'?

javascript - IE8 将弹出浏览器窗口移至背景