私はメソッドを持つ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
ありがとうございます、私のコードのいくつかの変更で動作します。 Serializrは、私が残念ながら避けられないかもしれないコンストラクタparamsを削除する必要があります。 – Blake
コンストラクタparamsのサポートを追加するのは難しくありませんでした。私はSerializrの著者にPRをしました。私はそれが受け入れられるときに更新するでしょう。 – Blake
PRが引き込まれ、現在利用可能です。 – Blake