2013-04-24 35 views
43

我必須在這裏失去了一些東西,但下面的代碼(Fiddle)返回一個空字符串工作:JSON.stringify不正常的Javascript數組

var test = new Array(); 
test['a'] = 'test'; 
test['b'] = 'test b'; 
var json = JSON.stringify(test); 
alert(json); 

什麼是JSON'ing本的正確方法陣列?

+4

這不是一個數組,你只是設置了兩個屬性 – 2013-04-24 15:43:10

+1

[JavaScript關聯數組到JSON]的可能重複(http://stackoverflow.com/questions/4425289/javascript-associative-array-to-json) – 2013-04-24 15:43:29

+7

開始出用'VAR測試= {};'而不是 – Ian 2013-04-24 15:43:38

回答

87

普通的JavaScript陣列設計與數字索引保存數據。您可以命名的東西上鍵向他們(當你想存儲有關保持正常的數組元這可能是有用的,有序的,數字索引數據),但是這不是他們所設計的。 JSON數組數據類型不能命名陣列上的按鍵。

如果你想命名的鍵,使用對象,而不是一個數組。

var test = {};   // Object 
test['a'] = 'test'; 
test['b'] = [];   // Array 
test['b'].push('item'); 
test['b'].push('item2'); 
test['b'].push('item3'); 
var json = JSON.stringify(test); 
alert(json); 
4

我張貼這種here

修復您可以使用此功能來修改JSON.stringify編碼arrays,只是張貼在接近腳本的開始(檢查上面的鏈接,更詳細):

// Upgrade for JSON.stringify, updated to allow arrays 
(function(){ 
    // Convert array to object 
    var convArrToObj = function(array){ 
     var thisEleObj = new Object(); 
     if(typeof array == "object"){ 
      for(var i in array){ 
       var thisEle = convArrToObj(array[i]); 
       thisEleObj[i] = thisEle; 
      } 
     }else { 
      thisEleObj = array; 
     } 
     return thisEleObj; 
    }; 
    var oldJSONStringify = JSON.stringify; 
    JSON.stringify = function(input){ 
     if(oldJSONStringify(input) == '[]') 
      return oldJSONStringify(convArrToObj(input)); 
     else 
      return oldJSONStringify(input); 
    }; 
})(); 
8

尼斯說明和示例的上方。我發現這個(JSON.stringify() array bizarreness with Prototype.js)完成了答案。有些網站使用JSONFilters實現自己的toJSON,所以刪除它。

if(window.Prototype) { 
    delete Object.prototype.toJSON; 
    delete Array.prototype.toJSON; 
    delete Hash.prototype.toJSON; 
    delete String.prototype.toJSON; 
} 

正常工作和測試的輸出:

console.log(json); 

結果:

"{"a":"test","b":["item","item2","item3"]}" 
+0

我有一個網站一些問題,覆蓋日期,所以當我用Date.toJSON失敗我,所以我說:Date.prototype.toJSON = Date.prototype.toISOString; – 2014-09-16 13:05:10

-6

JSON有有鍵值對。你仍然可以有一個數組作爲價值部分。因此添加的chousing的 「鑰匙」:

變種JSON = JSON.stringify({whatver:測試});

+6

這只是錯誤的。 'JSON.stringify([15,12])'將起作用。它會給''[15,12]「' – devnull69 2015-05-19 12:24:23

2

或者,你可以使用這樣

var test = new Array(); 
test[0]={}; 
test[0]['a'] = 'test'; 
test[1]={}; 
test[1]['b'] = 'test b'; 
var json = JSON.stringify(test); 
alert(json); 

這樣你JSON-ING一個陣列。