IE 8 支持 JSON.stringify() 吗?

Posted

技术标签:

【中文标题】IE 8 支持 JSON.stringify() 吗?【英文标题】:Is JSON.stringify() supported by IE 8? 【发布时间】:2011-03-20 14:32:42 【问题描述】:

我需要使用:

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 中包含这个吗?

【问题讨论】:

json.org/json2.js,正如它在源代码中所承诺的那样,是一个很大的 404。如果你不能自己托管 json2.js,你可能想使用这个 cdn:@987654321 @ @user246114 - 您能否将答案标记为正确。谢谢。 有需要的人,源文件现在在这里:raw.githubusercontent.com/douglascrockford/JSON-js/master/… 【参考方案1】:

一个 shiv 只是 createElement 的 HTML5 元素。它与 JSON 无关。尝试从 Crockford 获取真正的 JSON 解析器,例如 json2.js。

【讨论】:

我同意 json 解析器是最好的选择。 好的,那么上面的用法正确吗-我指向了我认为正确的js文件-但是IE8有必要吗?还是只需要为 IE6 和 IE7 包含它?谢谢【参考方案2】:

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

【讨论】:

这是正确的答案,但更一般地说,我建议查看YepNopeJS 或Modernizr 来检查是否有条件加载 json 库。 另请注意,如果用户在兼容性视图中,则 JSON 对象将不可用。 谢谢@nickk_can 和 Dave,我已经根据你们的 cmets 进行了更新。【参考方案3】:

如果您使用 IE 8 尝试JSON.stringify(),您需要确保它不在兼容模式下工作。 见JSON object undefined in Internet Explorer 8

你需要添加

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

到你的页面

【讨论】:

【参考方案4】:

您不需要使用条件来确定是否包含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不支持条件语句,所以我建议不要依赖它们,除非没有其他选择。)

【讨论】:

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

有更好的解决方案...

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

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 填充程序,如果浏览器支持它,它会回退到 JSON.stringify。 我撤回我的评论。我提到我们已经有一个图书馆。 是的,在添加答案之前我没有意识到这一点。直到,我猜。 请停止推荐 jquery 插件 没有任何$.toJSON方法。【参考方案6】:

将以下代码放入您的 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;
 ;

【讨论】:

如此轻量级的库!我喜欢它【参考方案7】:

如果你需要它在 IE 兼容模式下工作,Mozilla 已经为 JSON 对象制作了一个 polyfill。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON

if (!window.JSON) 
  window.JSON = 
    parse: function(sJSON)  return eval('(' + sJSON + ')'); ,
    stringify: (function () 
      var toString = Object.prototype.toString;
      var isArray = Array.isArray || function (a)  return toString.call(a) === '[object Array]'; ;
      var escMap = '"': '\\"', '\\': '\\\\', '\b': '\\b', '\f': '\\f', '\n': '\\n', '\r': '\\r', '\t': '\\t';
      var escFunc = function (m)  return escMap[m] || '\\u' + (m.charCodeAt(0) + 0x10000).toString(16).substr(1); ;
      var escRE = /[\\"\u0000-\u001F\u2028\u2029]/g;
      return function stringify(value) 
        if (value == null) 
          return 'null';
         else if (typeof value === 'number') 
          return isFinite(value) ? value.toString() : 'null';
         else if (typeof value === 'boolean') 
          return value.toString();
         else if (typeof value === 'object') 
          if (typeof value.toJSON === 'function') 
            return stringify(value.toJSON());
           else if (isArray(value)) 
            var res = '[';
            for (var i = 0; i < value.length; i++)
              res += (i ? ', ' : '') + stringify(value[i]);
            return res + ']';
           else if (toString.call(value) === '[object Object]') 
            var tmp = [];
            for (var k in value) 
            if (value.hasOwnProperty(k))
                tmp.push(stringify(k) + ': ' + stringify(value[k]));
            
             return '' + tmp.join(', ') + '';
          
        
        return '"' + value.toString().replace(escRE, escFunc) + '"';
      ;
    )()
  ;

【讨论】:

以上是关于IE 8 支持 JSON.stringify() 吗?的主要内容,如果未能解决你的问题,请参考以下文章

(转)JS之——解决IE678使用JSON.stringify报JSON未定义错误的问题

JSON对象和字符串之间的相互转换 – JSON.parse() 和 JSON.stringify()

IE8中JSON.stringify方法对自动转换unicode字符的解决方案

IE(6,7,8)兼容问题----'JSON' 未定义

TypeError:Object在IE 11中不支持此操作

json.stringify 不处理对象方法