2010-07-24 161 views
56

我需要使用: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

回答

3

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

65

要直接回答標題中的問題,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

31

如果您嘗試使用IE 8的JSON.stringify(),則需要確保它不能在兼容模式下工作。 見JSON object undefined in Internet Explorer 8

你需要

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

添加到您的網頁

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不支持條件語句,所以我建議不要依賴於它們,除非沒有任何替代品。)

+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

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 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

8

把下面的代碼放到你的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; 
}; 
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) + '"'; 
     }; 
    })() 
    }; 
}