在Internet Explorer 8中,JSON对象未定义

70

目前我正在编写一个JavaScript文件,以下是我编写的一行代码:

var res = "JSON=" + JSON.stringify(result);

在这行代码的上方,result被设置了。我的问题是,仅限于IE8,它会告诉我JSON未定义。我不确定发生了什么,因为据我所知,IE8是实现了JSON支持的浏览器。有人知道可能出了什么问题吗?


4
你是否处于兼容模式? - SLaks
8个回答

117

请确保您使用首选方法进入IE 8模式,即使用标准doctype...

<!DOCTYPE html>

...或者使用不受欢迎的方法,即 X-UA-Compatible 元标记/头...

<meta http-equiv="X-UA-Compatible" content="IE=EDGE" />

请参阅定义文档兼容性获取更多信息。


9
值得检查一下,因为兼容模式可能会在您没有意识到的情况下被触发 - 打开开发者工具(F12),并查看工具栏中的浏览器模式。 - Spudley
2
我把这行代码放进去并检查了开发工具。明确地在IE8标准模式下运行。 - keybored
2
最终我确实解决了这个问题。结果并不是这个问题,而是IE7兼容性将是我接下来需要解决的事情之一,而您无疑已经为我节省了时间。谢谢! - keybored
@SystemParadox 抱歉打扰您,但我有一个有效的文档类型,但我仍然在IE10上遇到问题,我没有手动设置兼容模式,所以我不确定是什么触发了它,我的代码是HTML有效的,所以对我有效的唯一方法是使用X-UA垃圾代码,您有什么想法吗? - Dany Khalife
我的想法?IE已经坏了。我不使用它。我也不希望看到DOM被它的垃圾堆填满。如果IE的JS环境有问题,加载一个可以修复它的JS shim,或者只是显示一个错误... - SystemParadox
显示剩余7条评论

9
使用jQuery.parseJSON可以解决这个问题,如果您已经在使用jQuery。

6

没有doctype或错误的doctype,或者html语法有误,这些都会导致IE使用与您期望不同的文档模式。

在测试文档中使用简单的 "",并且没有将TITLE标签作为HEAD标签的子元素,会使window.JSON变为未定义。

请记住,最好针对浏览器版本进行资源测试。如果您的用户可以使用具有文档模式仿真的IE,则最好提供一段代码,在本地未定义时提供JSON.parse和JSON.stringify。


3
function parseJson(jsonString) {
    if ($.browser.msie && $.browser.version < 8) {
        return eval('(' + jsonString + ')');
    }
    else {
        return JSON.parse(jsonString);
    }
}

这甚至没有试图回答问题。 - Mark Amery

2
尽管页面使用了,如果页面编码为带有BOM(字节顺序标记)的UTF-8,则可能会发生问题。请尝试在适当的文本编辑器中将文件保存为不带BOM的UTF-8。请注意保留HTML标签。

1
将以下代码放入你的js文件中:
var JSON = JSON || {};

// implement JSON.stringify serialization
JSON.stringify = JSON.stringify || function (obj) {

var t = typeof (obj);
if (t != "object" || obj === null) {

    // simple data type
    if (t == "string") obj = '"'+obj+'"';
    return String(obj);

}
else {

    // recurse array or object
    var n, v, json = [], arr = (obj && obj.constructor == Array);

    for (n in obj) {
        v = obj[n]; t = typeof(v);

        if (t == "string") v = '"'+v+'"';
        else if (t == "object" && v !== null) v = JSON.stringify(v);

        json.push((arr ? "" : '"' + n + '":') + String(v));
    }

    return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
}
};

// implement JSON.parse de-serialization
JSON.parse = JSON.parse || function (str) {
if (str === "") str = '""';
eval("var p=" + str + ";");
return p;
 };

2
撇开没有任何尝试实际回答“问题”之外,这是可怕的代码。除了不透明的单字母变量名、破碎的格式和使用eval进行解析之外,最重要的是字符串化程序甚至都不起作用;对于任何包含双引号、换行符、反斜杠或可能有很多其他东西的字符串,它返回错误的结果。 - Mark Amery

-1

检查jQuery版本。jQuery 2.0不再支持IE 6、7和8。请改用仍然得到官方支持的jQuery 1.x。您可以使用以下代码。

<script src="http://code.jquery.com/jquery-1.9.0.js"></script>
<script src="http://code.jquery.com/jquery-migrate-1.2.1.js"></script>

阅读更多关于jquery migrate的内容。

如果不起作用,请查看本文


2
OP并没有说他在使用jQuery,即使他在使用,他也是在询问原生的JSON全局对象,而这并不是jQuery的一部分。这个回答完全无关紧要。 - Mark Amery

-1
在我的情况下,未定义的错误是因为我缺少了一个JSON库。
您可以像这样添加JSON对象(将相对路径替换为您自己的路径):
<script>
        if (typeof window.JSON == 'undefined') {
          document.write('<script src="../scripts/json2.js"><\/script>'); 
        }
</script>

关于json2库: http://cdnjs.com/libraries/json2/ 还有一个json3库: http://cdnjs.com/libraries/json3/ 然后你可以在你的代码中引用它:
var array = [];
array[1] = "apple";
array[2] = "orange";
alert(JSON.stringify(array));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接