So, JSON.stringify provides a great way to turn a JS object like:
var baz = {"foo":1, "bar":someFunction};
in to a JSON string like:
{"foo":1}
It does this with an optional second argument that controls which fields should be serialized:
JSON.stringify(baz, ["foo"]);
That's great, but there's a problem. Let's say your "baz" is actually the property of another object, and you want to serialize that other object:
someObject.baz = {"foo":1, "bar":someFunction};
JSON.stringify(someObject, ["baz"]);
Well, normally you would just define a toJSON method on baz, eg.:
someObject.baz = {"foo":1, "bar":someFunction};
someObject.baz.toJSON = function() { /* logic to "toJSON" baz*/ }
JSON.stringify(someObject, ["baz"]);
Now, as I mentioned earlier, we have the perfect logic to "toJSON" baz already:
someObject.baz.toJSON = function() {
return JSON.stringify(baz, ["foo"]);
}
but if you try putting that in to your toJSON, you'll get a recursion error, because stringify will trigger the toJSON, which will trigger the stringify, which will ... :-(
You can work around this with a hack:
someObject.baz.toJSON = function() {
var oldToJON = this.toJSON;
this.toJSON = null;
var ret = JSON.stringify(baz, ["foo"]);
this.toJSON = oldToJON;
return ret;
}
But ... that just seems wrong. So, my question is: is there any way you can utilize the nifty built-in serialization power of JSON.stringify inside a toJSON method of an object (without having to hide the toJSON method itself during the stringify operation)?
See Question&Answers more detail:
os