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>
最佳答案
这只是修补。 http://support.microsoft.com/kb/976662
http://msdn.microsoft.com/en-us/library/cc836466(VS.85).aspx
关于json - IE8 原生 JSON.parse 错误导致堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1288962/