Parse JSON String into a Particular Object Prototype in JavaScript

javascript, json, object, parsing, prototype

Solution

The current answers contain a lot of hand-rolled or library code. This is not necessary.

Use `JSON.parse('{"a":1}')` to create a plain object.

Use one of the standardized functions to set the prototype:

- `Object.assign(new Foo, { a: 1 })`

- `Object.setPrototypeOf({ a: 1 }, Foo.prototype)`

Problem

I know how to parse a JSON String and turn it into a JavaScript Object. You can use `JSON.parse()` in modern browsers (and IE9+). That's great, but how can I take that JavaScript Object and turn it into a particular JavaScript Object (i.e. with a certain prototype)? For example, suppose you have: ``` function Foo() { this.a = 3; this.b = 2; this.test = function() {return this.a*this.b;}; } var fooObj = new Foo(); alert(fooObj.test() ); //Prints 6 var fooJSON = JSON.parse({"a":4, "b": 3}); //Something to convert fooJSON into a Foo Object //....... (this is what I am missing) alert(fooJSON.test() ); //Prints 12 ``` Again, I am not wondering how to convert a JSON string into a generic JavaScript Object. I want to know how to convert a JSON string into a "Foo" Object. That is, my Object should now have a function 'test' and properties 'a' and 'b'. UPDATE After doing some research, I thought of this... ``` Object.cast = function cast(rawObj, constructor) { var obj = new constructor(); for(var i in rawObj) obj[i] = rawObj[i]; return obj; } var fooJSON = Object.cast({"a":4, "b": 3}, Foo); ``` Will that work? UPDATE May, 2017: The "modern" way of doing this, is via `Object.assign`, but this function is not available in IE 11 or older Android browsers.

Original source

Related problems