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