JSON.stringify doesn't work with normal Javascript array

匿名 (未验证) 提交于 2019-12-03 02:11:02

问题:

I must be missing something here, but the following code (Fiddle) returns an empty string:

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

What is the correct way of JSON'ing this array?

回答1:

Normal JavaScript arrays are designed to hold data with numeric indexes. You can stuff named keys on to them (and this can be useful when you want to store metadata about an array which holds normal, ordered, numerically indexed data), but that isn't what they are designed for. The JSON array data type cannot have named keys on an array.

If you want named keys, use an Object, not an Array.

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


回答2:

Nice explanation and example above. I found this (JSON.stringify() array bizarreness with Prototype.js) to complete the answer. Some sites implements its own toJSON with JSONFilters, so delete it.

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

it works fine and the output of the test:

console.log(json); 

Result:

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


回答3:

I posted a fix for this here

You can use this function to modify JSON.stringify to encode arrays, just post it near the beginning of your script (check the link above for more detail):

// 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);     }; })(); 


回答4:

Alternatively you can use like this

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

Like this you JSON-ing a array.



回答5:

Json has to have key-value pairs. Tho you can still have an array as the value part. Thus add a "key" of your chousing:

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



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!