【问题标题】:Is JSON.stringify() supported by IE 8?IE 8 支持 JSON.stringify() 吗?
【发布时间】: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/…

标签: javascript


【解决方案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 对象将不可用。

【讨论】:

  • 这是正确的答案,但更一般地说,我建议查看YepNopeJSModernizr 来检查是否有条件加载 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) + '"';
          };
        })()
      };
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-22
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 2016-01-15
      • 1970-01-01
      • 2012-01-21
      相关资源
      最近更新 更多