IE 8 支持 JSON.stringify() 吗?

IT技术 javascript
2021-02-16 23:59:25

我需要使用:

JSON.stringify()

Chrome、Safari 和 Firefox 应该支持它。我认为 IE8 也支持 JSON 对象。我认为 IE7 和 6 没有,所以我这样做:

<!--[if lt IE 8]>
    <script src="http://www.json.org/json2.js"></script>
<![endif]-->

所以,我认为这只会在 IE6 和 7 时导入外部 JavaScript。我查看了托管脚本的 URL,它们仅在 IE 版本小于 9 时才包括在内:

http://code.google.com/p/html5shiv/
<!--[if lt IE 9]>
    <script src="http://www.json.org/json2.js"></script>
<![endif]-->

所以我也应该为 IE 8 包含这个吗?

6个回答

直接回答标题中的问题,是IE8原生支持的JSON.stringify()

IE8 是第一个获得此支持的 IE 版本,开发团队在此处详细解释了该功能:http : //blogs.msdn.com/b/ie/archive/2008/09/10/native-json -in-ie8.aspx

回答问题的第二部分,是的,您需要为 IE6/IE7 包含替代功能。像 Modernizr 这样的东西可以很容易地检查这个。

另请注意,如果用户处于 IE8 的兼容性视图中,则 JSON 对象将不可用。

这是正确的答案,但更一般地说,我建议查看YepNopeJSModernizr来检查有条件地加载 json 库。
2021-04-16 23:59:25
另请注意,如果用户处于兼容性视图中,则 JSON 对象将不可用。
2021-04-23 23:59:25
感谢@nickk_can 和 Dave,我已经根据您的评论进行了更新。
2021-05-14 23:59:25

如果您尝试JSON.stringify()使用 IE 8,您需要确保它不在兼容模式下工作。请参阅Internet Explorer 8 中未定义的 JSON 对象

你需要添加

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

到您的页面

有更好的解决办法...

这不会直接回答您的问题,而是为您的问题提供完整的解决方案。

jQuery的JSON库提供了一个使用本地JSON对象实现,如果它是可用的,并回落到它自己的JSON实现,如果它不是一个包装。这意味着它可以在任何浏览器中工作。

这是项目主页上的用法示例:

var thing = {plugin: 'jquery-json', version: 2.3};

var encoded = $.toJSON( thing );
// '{"plugin":"jquery-json","version":2.3}'
var name = $.evalJSON( encoded ).plugin;
// "jquery-json"
var version = $.evalJSON(encoded).version;
// 2.3

用法很简单:toJSON字符串化JS源码;evalJSON 将 JSON 字符串数据转换回 JavaScript 对象。

你看看源代码,实现非常简单,但效果很好。我在几个项目中亲自使用过它。

如果它适用于每个浏览器,则无需进行浏览器检测。

我不确定投反对票是为了什么。这只不过是一个用于 JSON 支持的 JS polyfill,如果浏览器支持,它会回退到 JSON.stringify。
2021-04-16 23:59:25
请停止建议 jquery 插件
2021-04-21 23:59:25
我撤回我的评论。我提到我们已经有一个图书馆。
2021-05-04 23:59:25
是的,在添加我的答案之前我没有意识到这一点。TIL,我猜。
2021-05-05 23:59:25
没有任何$.toJSON方法。
2021-05-08 23:59:25

将以下代码放入您的 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;
 };
这么轻量级的库!我喜欢
2021-05-01 23:59:25

您不需要使用条件来确定是否包含json2.js看一下源代码:

var JSON;
if (!JSON) {
    JSON = {};
}

if (typeof JSON.stringify !== 'function') {
    JSON.stringify = function (value, replacer, space) {
        // Code
    }
}

if (typeof JSON.parse !== 'function') {
    JSON.parse = function (text, reviver) {
        // Code
    }
}

它的作用是首先检查是否JSON已经作为对象存在。如果没有,那么它会创建一个新对象来容纳 JSON 函数。然后,它检查.stringify().parse()存在的本机实现如果没有,那么它会创建这些函数。

底线:如果本机实现存在,包括json2.js不会覆盖本机实现。否则,它将添加该功能,因此您没有理由需要使用条件,除非您试图最小化请求。

(也可能会注意到 IE10 不支持条件语句,所以我建议不要依赖它们,除非没有其他选择。)

@ClodoaldoNeto 是的,这是真的。但是,通常人们一直依赖条件语句来解释 Internet Explorer 标准实施中的差异。IE10 及更高版本不再支持条件,因此该评论与 OP 对条件的使用有关。我的回答是,json2.js 不需要条件,因为它不会覆盖本地方法,但需要注意的是,开发人员需要开始摆脱 Internet Explorer 未来版本的条件。
2021-04-25 23:59:25
当然,在没有使用某种资产打包的情况下,您可能不想要额外的请求。
2021-04-29 23:59:25
如果IE10 不支持条件语句,它会不会将 OP 发布的那些行视为评论?我错过了什么?
2021-05-04 23:59:25
+1 很好的答案。您介意在回答中为我们这些以前没有遇到过 json2.js 的人添加一个链接吗?
2021-05-07 23:59:25