时间:2010-07-24 20:59:23

标签: javascript

7 个答案:

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