IE 8是否支持JSON.stringify()?

use*_*114 58 javascript

我需要用:

JSON.stringify()
Run Code Online (Sandbox Code Playgroud)

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

<!--[if lt IE 8]>
    <script src="http://www.json.org/json2.js"></script>
<![endif]-->
Run Code Online (Sandbox Code Playgroud)

所以,我认为这只会在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]-->
Run Code Online (Sandbox Code Playgroud)

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

whi*_*and 66

要直接回答标题中的问题,是的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对象将不可用.

  • 另请注意,如果用户处于兼容性视图中,则JSON对象将不可用. (11认同)

小智 31

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

你需要添加

<meta http-equiv="X-UA-Compatible" content="IE=8" />
Run Code Online (Sandbox Code Playgroud)

到你的页面


Eva*_*ice 16

有一个更好的解决方案......

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

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
Run Code Online (Sandbox Code Playgroud)

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

在你看源头时,实现起来非常简单,但效果非常好.我在一些项目中亲自使用过它.

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

  • 请停止建议jquery插件 (2认同)

ato*_*217 10

将以下代码放入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;
 };
Run Code Online (Sandbox Code Playgroud)


sal*_*uce 9

您不需要使用条件来确定是否包含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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 当然,在没有使用某种资产包装的情况下,您可能不需要额外的请求. (2认同)

med*_*iev 3

shiv 只是createElementHTML5 元素。它与 JSON 无关。尝试从 Crockford 获取像 json2.js 这样的实际 JSON 解析器。