2013-04-24 28 views
43

tôi phải mất một cái gì đó ở đây, nhưng đoạn mã sau (Fiddle) trả về một chuỗi rỗng:JSON.stringify không làm việc với bình thường mảng javascript

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

cách chính xác của JSON'ing này là gì mảng?

+4

Đó không phải là mảng, bạn chỉ cần đặt hai thuộc tính –

+1

có thể trùng lặp của [mảng kết hợp JavaScript thành JSON] (http://stackoverflow.com/questions/4425289/javascript-associative-array-to-json) –

+7

Bắt đầu với 'var test = {};' thay vì – Ian

Trả lời

87

Mảng JavaScript thông thường được thiết kế để giữ dữ liệu với chỉ số số. Bạn có thể đặt tên cho các khóa đó (và điều này có thể hữu ích khi bạn muốn lưu trữ siêu dữ liệu về một mảng chứa dữ liệu được lập chỉ mục, số lượng), nhưng đó không phải là những gì chúng được thiết kế. Loại dữ liệu mảng JSON không thể có các khóa có tên trên một mảng.

Nếu bạn muốn các khóa có tên, hãy sử dụng một đối tượng, không phải là một mảng.

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

tôi đã đăng một sửa chữa cho điều này here

Bạn có thể sử dụng chức năng này để sửa đổi JSON.stringify để mã hóa arrays, chỉ cần dán nó gần đầu kịch bản của bạn (đánh dấu vào đường link trên để xem chi tiết hơn):

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

Giải thích và ví dụ tuyệt vời ở trên. Tôi tìm thấy điều này (JSON.stringify() array bizarreness with Prototype.js) để hoàn thành câu trả lời. Một số trang web thực hiện riêng của mình toJSON với JSONFilters, do đó, xóa nó.

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

nó hoạt động tốt và đầu ra của thử nghiệm:

console.log(json); 

Kết quả:

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

Tôi đã có một số vấn đề với một trang web ghi đè ngày, vì vậy khi tôi sử dụng Date.toJSON không thành công tôi vì vậy tôi đã thêm: Date.prototype.toJSON = Date.prototype.toISOString; –

-6

Json phải có cặp khóa-giá trị. Tho bạn vẫn có thể có một mảng là phần giá trị. Do đó, hãy thêm "khóa" của việc lưu giữ của bạn:

var json = JSON.stringify ({whatver: test});

+6

Điều này chỉ là sai. 'JSON.stringify ([15,12])' sẽ hoạt động. Nó sẽ cho '" [15,12] "' – devnull69

2

Hoặc bạn có thể sử dụng như thế này

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

Như thế này bạn JSON-ing một mảng.

Các vấn đề liên quan