Nik*_*Nik 32 javascript serialization json typescript
是否有任何方法可以对Typescript对象进行JSON序列化/反序列化,以便它们不会丢失类型信息?简单JSON.parse(JSON.stringify)有太多警告.
或者我应该使用adhoc解决方案?
bas*_*rat 31
使用接口获取强类型:
// Creating
var foo:any = {};
foo.x = 3;
foo.y='123';
var jsonString = JSON.stringify(foo);
alert(jsonString);
// Reading
interface Bar{
x:number;
y?:string;
}
var baz:Bar = JSON.parse(jsonString);
alert(baz.y);
Run Code Online (Sandbox Code Playgroud)
如果需要,可以使用类型断言"<>".
我认为处理此问题的更好方法是使用Object.assign(但是需要ECMAScript 2015)。
上一堂课
class Pet {
name: string;
age: number;
constructor(name?: string, age?: number) {
this.name = name;
this.age = age;
}
getDescription(): string {
return "My pet " + this.name + " is " + this.age + " years old.";
}
static fromJSON(d: Object): Pet {
return Object.assign(new Pet(), d);
}
}
Run Code Online (Sandbox Code Playgroud)
像这样序列化和反序列化...
var p0 = new Pet("Fido", 5);
var s = JSON.stringify(p0);
var p1 = Pet.fromJSON(JSON.parse(s));
console.log(p1.getDescription());
Run Code Online (Sandbox Code Playgroud)
为了使这个例子更上一层楼,请考虑嵌套对象...
class Type {
kind: string;
breed: string;
constructor(kind?: string, breed?: string) {
this.kind = kind;
this.breed = breed;
}
static fromJSON(d: Object) {
return Object.assign(new Type(), d);
}
}
class Pet {
name: string;
age: number;
type: Type;
constructor(name?: string, age?: number) {
this.name = name;
this.age = age;
}
getDescription(): string {
return "My pet " + this.name + " is " + this.age + " years old.";
}
getFullDescription(): string {
return "My " + this.type.kind + ", a " + this.type.breed + ", is " + this.age + " years old.";
}
static fromJSON(d: Object): Pet {
var o = Object.assign(new Pet(), d);
o.type = Type.fromJSON(o['type']);
return o;
}
}
Run Code Online (Sandbox Code Playgroud)
像这样序列化和反序列化...
var q0 = new Pet("Fido", 5);
q0.type = new Type("dog", "Pomeranian");
var t = JSON.stringify(q0);
var q1 = Pet.fromJSON(JSON.parse(t));
console.log(q1.getFullDescription());
Run Code Online (Sandbox Code Playgroud)
因此,与使用接口不同,此方法保留了方法。
| 归档时间: |
|
| 查看次数: |
33998 次 |
| 最近记录: |