答案 0 :(得分: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对象将不可用。
答案 1 :(得分:31)
如果您使用IE 8尝试JSON.stringify()
,则需要确保它无法在兼容模式下运行。
见JSON object undefined in Internet Explorer 8
您需要添加
<meta http-equiv="X-UA-Compatible" content="IE=8" />
到你的页面
答案 2 :(得分: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
用法非常简单:toJSON将JS源字符串化; evalJSON将JSON字符串数据转换回JavaScript对象。
在你看源代码时,实现起来非常简单,但效果非常好。我在一些项目中亲自使用过它。
如果它适用于每个浏览器,则无需进行浏览器检测。
答案 3 :(得分: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
}
}
这样做首先检查JSON
是否已作为对象存在。如果没有,那么它会创建一个新对象来容纳JSON函数。然后,它会检查是否存在.stringify()
或.parse()
的本机实现。如果没有,那么它会创建这些功能。
底线:如果存在本机实现,包括json2.js
将不会覆盖本机实现。否则,它将添加该功能,因此除非您尝试最小化请求,否则您无需使用条件。
(也可能会注意到IE10不支持条件语句,因此除非没有其他选择,否则我建议不要依赖它们。) < / p>
答案 4 :(得分:9)
将以下代码放入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;
};
答案 5 :(得分:3)
答案 6 :(得分:1)
只是为了跟进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) + '"';
};
})()
};
}