I'm looking for a solution to serialize (and unserialize) Javascript objects to a string across browsers, including members of the object that happen to be functions. A typical object will look like this:
{
color: 'red',
doSomething: function (arg) {
alert('Do someting called with ' + arg);
}
}
doSomething() will only contain local variables (no need to also serialize the calling context!).
JSON.stringify() will ignore the 'doSomething' member because it's a function. I known the toSource() method will do what I want but it's FF specific.
Something like this...
Note: this is an expression. It returns a string representation of the object that is passed in as an argument (in my example, I'm passing the in an variable named obj).
You can also override the toString method of the Object's prototype:
It's impossible without the help of the object itself. For example, how would you serialize the result of this expression?
If you just take the text of the function, then when you deserialize,
x
will refer to the global variable, not one in a closure. Also, if your function closes over browser state (like a reference to a div), you'd have to think about what you want that to mean.You can, of course, write your own methods specific to individual objects that encode what semantics you want references to other objects to have.
A quick and dirty way would be like this:
Obviously this will affect the serialization of every object in your code, and could trip up niave code using unfiltered
for in
loops. The "proper" way would be to write a recursive function that would add thetoJSON
function on all the descendent members of any given object, dealing with circular references and such. However, assuming single threaded Javascript (no Web Workers), this method should work and not produce any unintended side effects.A similar function must be added to Array's prototype to override Object's by returning an array and not an object. Another option would be attaching a single one and let it selectively return an array or an object depending on the objects' own nature but it would probably be slower.
http://jsbin.com/yerumateno/2/edit
JSONfn plugin is exactly what you're looking for.
http://www.eslinstructor.net/jsonfn/
--Vadim
You can use
JSON.stringify
with areplacer
like: