Parse JSON String into a Particular Object Prototype in JavaScript Parse JSON String into a Particular Object Prototype in JavaScript json json

Parse JSON String into a Particular Object Prototype in JavaScript


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

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

  2. Use one of the standardized functions to set the prototype:

    • Object.assign(new Foo, { a: 1 })
    • Object.setPrototypeOf({ a: 1 }, Foo.prototype)


See an example below (this example uses the native JSON object). My changes are commented in CAPITALS:

function Foo(obj) // CONSTRUCTOR CAN BE OVERLOADED WITH AN OBJECT{    this.a = 3;    this.b = 2;    this.test = function() {return this.a*this.b;};    // IF AN OBJECT WAS PASSED THEN INITIALISE PROPERTIES FROM THAT OBJECT    for (var prop in obj) this[prop] = obj[prop];}var fooObj = new Foo();alert(fooObj.test() ); //Prints 6// INITIALISE A NEW FOO AND PASS THE PARSED JSON OBJECT TO ITvar fooJSON = new Foo(JSON.parse('{"a":4,"b":3}'));alert(fooJSON.test() ); //Prints 12


Do you want to add JSON serialization/deserialization functionality, right? Then look at this:

You want to achieve this:

UML

toJson() is a normal method.
fromJson() is a static method.

Implementation:

var Book = function (title, author, isbn, price, stock){    this.title = title;    this.author = author;    this.isbn = isbn;    this.price = price;    this.stock = stock;    this.toJson = function (){        return ("{" +            "\"title\":\"" + this.title + "\"," +            "\"author\":\"" + this.author + "\"," +            "\"isbn\":\"" + this.isbn + "\"," +            "\"price\":" + this.price + "," +            "\"stock\":" + this.stock +        "}");    };};Book.fromJson = function (json){    var obj = JSON.parse (json);    return new Book (obj.title, obj.author, obj.isbn, obj.price, obj.stock);};

Usage:

var book = new Book ("t", "a", "i", 10, 10);var json = book.toJson ();alert (json); //prints: {"title":"t","author":"a","isbn":"i","price":10,"stock":10}var book = Book.fromJson (json);alert (book.title); //prints: t

Note: If you want you can change all property definitions like this.title, this.author, etc by var title, var author, etc. and add getters to them to accomplish the UML definition.