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

问题描述:

我需要使用:JSON.stringify()是否支持IE 8?

JSON.stringify() 

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

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

所以,我认为这将导入外部JavaScript只有IE6 & 7.我看了一下网址,其中脚本托管,他们只包括如果IE版本小于9:

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

所以我应该包括这对于IE 8呢?

+14

json.org/json2.js,因为它在源代码中所承诺的,是一块大肥肉404你可能想用这个CDN如果您不能承载json2.js自己:http://cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js – tjp 2012-07-05 16:30:54

+3

@ user246114 - 您能否请您将答案标记为正确。谢谢。 – Lee 2013-07-26 14:22:58

+0

对于那些需要帮助的人,源文件现在位于:https://raw.githubusercontent.com/douglascrockford/JSON-js/master/json2.js – hussfelt 2014-11-14 12:33:22

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

+0

我同意json解析器是最好的选择。 – 2010-07-24 21:13:46

+1

好吧,上面的用法是正确的 - 我指出了我认为正确的js文件 - 但它是否需要IE8?还是只需要包含IE6和IE7?谢谢 – user246114 2010-07-25 14:15:44

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

+0

这是正确的答案,但更普遍我建议看[YepNopeJS](http://yepnopejs.com/)或[Modernizr](http://www.modernizr.com/)做检查有条件地加载json库。 – 2012-02-11 00:46:05

+11

另请注意,如果用户处于兼容性视图中,则JSON对象将不可用。 – Dave 2012-11-20 19:46:16

+0

感谢@nickk_can和戴夫,我根据您的意见进行了更新。 – Lee 2013-07-26 14:22:05

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

你需要

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

添加到您的网页

你并不需要使用条件来确定是否包括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不支持条件语句,所以我建议不要依赖于它们,除非没有任何替代品。)

+2

当然,如果没有用某种资产包装进行汇总,您可能不需要额外的请求。 – gtd 2012-09-16 20:56:20

+0

如果_IE10不支持条件语句_是否看不到OP发布的行作为注释?我错过了什么? – 2013-10-30 16:14:59

+0

@ClodoaldoNeto是的,的确如此。但是,通常人们一直依赖条件语句来解释Internet Explorer执行标准的差异。 IE10及以上版本不再支持条件,因此评论与OP使用条件有关。我的回答是,json2.js条件不是必需的,因为它不会覆盖原生方法,因此开发人员需要开始摆脱Internet Explorer的条件以适应未来版本。 – saluce 2013-10-30 19:26:51

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

这并不直接回答你的问题,它提供了一个完整的解决方案,而不是你的问题。

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 stringifies的JS源; evalJSON将JSON字符串数据转换回JavaScript对象。

你看看源代码,实现起来非常简单,但它工作得很好。我在一些项目中亲自使用过它。

如果它在每个浏览器中都有效,就不需要执行浏览器检测。

+0

我不确定downvote是什么。这只不过是一个JS填充JSON支持,如果浏览器支持它,它将回落到JSON.stringify。 – 2013-06-25 17:41:23

+0

我撤回了我的评论。我提到我们已经有一个图书馆。 – naveen 2014-03-25 05:40:52

+0

是的,在添加我的答案之前我没有意识到。 TIL,我猜。 – 2014-12-15 05:46:38

把下面的代码放到你的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; 
}; 

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

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) + '"'; 
     }; 
    })() 
    }; 
}