这个问题比较宽泛,所以我将给出几个解决方案。
解决方案 1:辅助方法
这是一个使用帮助器方法的示例,您可以根据自己的需要进行更改:
class SerializationHelper {
static toInstance<T>(obj: T, json: string) : T {
var jsonObj = JSON.parse(json);
if (typeof obj["fromJSON"] === "function") {
obj["fromJSON"](jsonObj);
}
else {
for (var propName in jsonObj) {
obj[propName] = jsonObj[propName]
}
}
return obj;
}
}
然后使用它:
var json = '{"name": "John Doe"}',
foo = SerializationHelper.toInstance(new Foo(), json);
foo.GetName() === "John Doe";
高级反序列化
这还可以通过将您自己的 fromJSON 方法添加到类中来实现一些自定义反序列化(这与 JSON.stringify 已经使用 toJSON 方法的方式很好,如下所示):
interface IFooSerialized {
nameSomethingElse: string;
}
class Foo {
name: string;
GetName(): string { return this.name }
toJSON(): IFooSerialized {
return {
nameSomethingElse: this.name
};
}
fromJSON(obj: IFooSerialized) {
this.name = obj.nameSomethingElse;
}
}
然后使用它:
var foo1 = new Foo();
foo1.name = "John Doe";
var json = JSON.stringify(foo1);
json === '{"nameSomethingElse":"John Doe"}';
var foo2 = SerializationHelper.toInstance(new Foo(), json);
foo2.GetName() === "John Doe";
解决方案 2:基类
另一种方法是创建自己的基类:
class Serializable {
fillFromJSON(json: string) {
var jsonObj = JSON.parse(json);
for (var propName in jsonObj) {
this[propName] = jsonObj[propName]
}
}
}
class Foo extends Serializable {
name: string;
GetName(): string { return this.name }
}
然后使用它:
var foo = new Foo();
foo.fillFromJSON(json);
使用基类实现自定义反序列化的方法太多了,所以我将根据您的需要来决定。