Convert javascript object or array to json for ajax data Convert javascript object or array to json for ajax data json json

Convert javascript object or array to json for ajax data


I'm not entirely sure but I think you are probably surprised at how arrays are serialized in JSON. Let's isolate the problem. Consider following code:

var display = Array();display[0] = "none";display[1] = "block";display[2] = "none";console.log( JSON.stringify(display) );

This will print:

["none","block","none"]

This is how JSON actually serializes array. However what you want to see is something like:

{"0":"none","1":"block","2":"none"}

To get this format you want to serialize object, not array. So let's rewrite above code like this:

var display2 = {};display2["0"] = "none";display2["1"] = "block";display2["2"] = "none";console.log( JSON.stringify(display2) );

This will print in the format you want.

You can play around with this here: http://jsbin.com/oDuhINAG/1/edit?js,console


You can use JSON.stringify(object) with an object and I just wrote a function that'll recursively convert an array to an object, like this JSON.stringify(convArrToObj(array)), which is the following code (more detail can be found on this answer):

// Convert array to objectvar 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;}

To make it more generic, you can override the JSON.stringify function and you won't have to worry about it again, to do this, just paste this at the top of your page:

// Modify JSON.stringify to allow recursive and single-level 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){        return oldJSONStringify(convArrToObj(input));    };})();

And now JSON.stringify will accept arrays or objects! (link to jsFiddle with example)


Edit:

Here's another version that's a tad bit more efficient, although it may or may not be less reliable (not sure -- it depends on if JSON.stringify(array) always returns [], which I don't see much reason why it wouldn't, so this function should be better as it does a little less work when you use JSON.stringify with an object):

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

jsFiddle with example here

js Performance test here, via jsPerf