2016-08-12 10 views
0

私はメソッドを持つTypescriptクラスを持っています。私は、JSON表現がメソッドとプロトタイプ情報を失うRESTを通して、これらのオブジェクトをサーバーからブラウザーに転送することになります。メソッドを使ってJSONをオブジェクトに戻して、クライアント側で使用できるようにしたいと思います。私はJSONオブジェクトを取り込み、オブジェクトを再作成する静的メソッドを使用してきましたが、それはかなり手作業です。JSONからJavascriptへのメソッド

良い方法がありますか?

class Rectangle { 
    constructor(public width: number, public height: number) { } 
    public getArea(): number { 
     return this.width * this.height; 
    } 

    public static fromPojo(pojo: any): Rectangle { 
     if (pojo 
      && pojo.width !== undefined 
      && pojo.height !== undefined) { 
       return new Rectangle(pojo.width, pojo.height); 
      } 
     throw new Error("Pojo is not a Rectangle"); 
    } 
} 

let rect = new Rectangle(10, 20); 
console.log(rect.getArea()); // 200 
let json = JSON.stringify(rect); // {"width":10,"height":20} 

let rectFromJson = <Rectangle>JSON.parse(json); 
console.log(rectFromJson.getArea()); // Error: rectFromJson.getArea is not a function 

let rectFromPojo = Rectangle.fromPojo(JSON.parse(json)); 
console.log(rectFromPojo.getArea()); // 200 

プロパティがオブジェクトに追加された場合、私はこの戦術エラーが発生しやすいを作り、fromPojo()メソッドを更新を確認する必要があります。理想的には、静的なfromPojo(pojo)メソッドを取り除き、もっと信頼できる/自動的なものにしたいと思っています。

更新: Nick Uraltsevの示唆しているように、Serializrで動作するコードは次のとおりです。エラーは発生しにくいが、コンストラクタparamsを失う。私はコンストラクタのparamsを保持できることを好むだろう。

import { deserialize, serializable, serialize } from "serializr"; 
class Rectangle { 
    @serializable 
    public width: number; 
    @serializable 
    public height: number; 

    public getArea(): number { 
     return this.width * this.height; 
    } 
} 

let rect = new Rectangle(); 
rect.width = 10; 
rect.height = 20; 

let serJson = serialize(rect); 
console.log(serJson); // { width: 10, height: 20 } 

let reconstructedRect = deserialize(Rectangle, serJson); 
console.log(reconstructedRect.getArea()); // 200 

答えて

1

Serializrをご覧ください。あなたの必要としているものとまったく同じように見えます。

+0

ありがとうございます、私のコードのいくつかの変更で動作します。 Serializrは、私が残念ながら避けられないかもしれないコンストラクタparamsを削除する必要があります。 – Blake

+0

コンストラクタparamsのサポートを追加するのは難しくありませんでした。私はSerializrの著者にPRをしました。私はそれが受け入れられるときに更新するでしょう。 – Blake

+0

PRが引き込まれ、現在利用可能です。 – Blake

関連する問題