Internet Explorer 8中未定义的JSON对象


70

目前,我正在编写一个JavaScript文件,并包含以下行:

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

结果被设置在这条线的正上方。我遇到的问题是IE8(仅限IE8)向我报告了JSON未定义。我不确定该怎么做,因为据我了解,IE8是实现了JSON支持的浏览器。有谁知道会发生什么?


4
您是否处于兼容模式?
SLaks 2011年

Answers:


117

通过使用首选方法(标准doctype),确保您实际上处于IE 8模式下。

<!DOCTYPE html>

或不需要的方法,X-UA-Compatible元标记/标题

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

有关更多信息,请参见定义文档兼容性


9
绝对值得检查一下,因为可以在无需完全意识到的情况下触发兼容模式-打开开发人员工具(F12),然后在工具栏中查找浏览器模式。
Spudley 2011年

2
我放下了这行,并检查了开发工具。绝对在IE8标准模式下运行。
keybord 2011年

@keybored:然后必须覆盖JSON全局对象。检查您的代码是否有变化JSON =(您在问题中编写的示例代码是一个好的开始-您是否在使用eval?)。
安迪E

我还没有看到这样的东西,但是我想知道,上面的调用是在iframe中进行的。我是否需要打电话给父母才能真正获得JSON?
keybord 2011年

2
最终,我确实解决了问题。事实证明,与IE7的兼容性并不是我接下来要做的事情之一,而您无疑已经节省了我的时间。谢谢!
keybord 2011年


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'3

2

即使<!DOCTYPE html>页面编码UTF-8带有BOM(字节顺序标记),也可能会发生。尝试使用合适的文本编辑器将文件另存为UTF-8不带BOM


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'3

-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 migration的信息

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


2
OP并没有说他正在使用jQuery,即使他使用了jQuery,他也正在询问JSON不属于jQuery的本机全局变量。这个答案是完全不相关的。
Mark Amery'3

-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));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.