Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you use JSON.stringify in a custom toJSON method?

Tags:

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

like image 948
machineghost Avatar asked Nov 26 '10 23:11

machineghost


People also ask

Does JSON Stringify call toJSON?

JSON.stringify() calls toJSON with one parameter, the key , which has the same semantic as the key parameter of the replacer function: if this object is a property value, the property name. if it is in an array, the index in the array, as a string. if JSON.stringify() was directly called on this object, an empty string.

What is toJSON () in JSON?

The toJSON() method returns a date object as a string, formatted as a JSON date. JSON dates have the same format as the ISO-8601 standard: YYYY-MM-DDTHH:mm:ss.sssZ.

What is the use of JSON Stringify () function?

The JSON. stringify() function will convert any dates into strings.

Can you JSON Stringify a function?

The JSON. stringify() function, as name suggests, converts a JavaScript value to a serialized JSON string. JSON. stringify() can optionally use a replacer function to replace values using custom logic.


1 Answers

Crockford's json2.js says:

A toJSON method does not serialize: it returns the value represented by the name/value pair that should be serialized, or undefined if nothing should be serialized.

So you are simply expected to return the value that you want serialized. In your case, baz.toJSON should simply return the portion of the baz object that you want serialized:

someObject.baz.toJSON = function() {   return { foo: this.foo }; }; 
like image 154
casablanca Avatar answered Oct 01 '22 04:10

casablanca