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呢?
shiv只是createElement
的HTML5元素。它与JSON无关。尝试从Crockford获得像json2.js这样的实际JSON解析器。
我同意json解析器是最好的选择。 – 2010-07-24 21:13:46
好吧,上面的用法是正确的 - 我指出了我认为正确的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对象将不可用。
如果您尝试使用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不支持条件语句,所以我建议不要依赖于它们,除非没有任何替代品。)
当然,如果没有用某种资产包装进行汇总,您可能不需要额外的请求。 – gtd 2012-09-16 20:56:20
如果_IE10不支持条件语句_是否看不到OP发布的行作为注释?我错过了什么? – 2013-10-30 16:14:59
@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对象。
你看看源代码,实现起来非常简单,但它工作得很好。我在一些项目中亲自使用过它。
如果它在每个浏览器中都有效,就不需要执行浏览器检测。
我不确定downvote是什么。这只不过是一个JS填充JSON支持,如果浏览器支持它,它将回落到JSON.stringify。 – 2013-06-25 17:41:23
我撤回了我的评论。我提到我们已经有一个图书馆。 – naveen 2014-03-25 05:40:52
是的,在添加我的答案之前我没有意识到。 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) + '"';
};
})()
};
}
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
@ user246114 - 您能否请您将答案标记为正确。谢谢。 – Lee 2013-07-26 14:22:58
对于那些需要帮助的人,源文件现在位于:https://raw.githubusercontent.com/douglascrockford/JSON-js/master/json2.js – hussfelt 2014-11-14 12:33:22