Reputation: 1752
I have tried to convert a JS object into JSON.
JSON.stringify({a:1, toJSON: function(){}})
Native JSON stringify is not working as expected. JSON stringify executes toJSON function in JS object internally. I have overwritten native code as follows,
// Adding try catch for non JSON support browsers.
try{
_jsonStringify = JSON.stringify;
JSON.stringify = function(object){
var fnCopy = object.toJSON;
object.toJSON = undefined;
var result = _jsonStringify(object);
object.toJSON = fnCopy;
return result;
};
}catch(e){}
It is working fine. is there any other better way to do this?. is there any specific reason in native code execute toJSON function in input object?
Upvotes: 15
Views: 72028
Reputation: 106640
This is because JSON.stringify
will return the return value of the toJSON
function if it exists (Source).
For example:
JSON.stringify({a:1, toJSON: function(){ return "a"; }});
Will return:
"a"
This behaviour is described on MDN. The reason for this is so that you can customize the behaviour of the serialization. For example, say I only want to serialize the IDs of the Animal
class in this example. I could do the following:
var Animal = function(id, name) {
this.AnimalID = id;
this.Name = name;
};
Animal.prototype.toJSON = function() {
return this.AnimalID;
};
var animals = [];
animals.push(new Animal(1, "Giraffe"));
animals.push(new Animal(2, "Kangaroo"));
JSON.stringify(animals); // Outputs [1,2]
If you do not want this behaviour then your current method works well; however, I would recommend not overwriting the behaviour of JSON.stringify
, but rather name your method something else. An external library might be using the toJSON
function in an object and it could lead to unexpected results.
Upvotes: 13
Reputation: 3888
The reason the native JSON.stringify
doesn't work is because it can't stringify functions. By setting the only function, toJSON
, to undefined, JSON.stringify returns the proper value. See this question for more details: JSON.stringify function
If you're trying to remove functions entirely, you can do this:
JSON.stringify(object, function(key, value) {
if (typeof value === "function") {
return undefined;
}
return value;
});
Upvotes: 0
Reputation: 131
The JSON.stringify
function is usually invoked with one parameter, which is the object you want to serialize to JSON string. I believe there's a second optional parameter, which is a function that replaces one or more properties' way of serialization.
However, you should not add a function as a second property of your object!
When trying the following in Chrome's console:
JSON.stringify({a:1,b:'hello'})
This is the result:
"{"a":1,"b":"hello"}"
Upvotes: -3