Существуют ли какие-либо средства для сериализации/десериализации JSON объектов Typescript, чтобы они не потеряли информацию о типе? Простой JSON.parse(JSON.stringify)
имеет слишком много предостережений.
Или я должен использовать adhoc-решения?
Существуют ли какие-либо средства для сериализации/десериализации JSON объектов Typescript, чтобы они не потеряли информацию о типе? Простой JSON.parse(JSON.stringify)
имеет слишком много предостережений.
Или я должен использовать adhoc-решения?
Используйте интерфейсы для получения сильных типов:
// 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);
И используйте утверждение типа "< > ", если вам нужно.
Я думаю, что лучший способ справиться с этим - использовать 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);
}
}
Сериализовать и десериализовать вот так...
var p0 = new Pet("Fido", 5);
var s = JSON.stringify(p0);
var p1 = Pet.fromJSON(JSON.parse(s));
console.log(p1.getDescription());
Чтобы привести этот пример на следующий уровень, рассмотрите вложенные объекты...
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;
}
}
Сериализовать и десериализовать вот так...
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());
Таким образом, в отличие от использования интерфейса, этот подход сохраняет методы.
Ответ AQuirky работает для меня. У вас могут возникнуть проблемы с методом Object.assign. Мне пришлось изменить свой tsconfig.json, чтобы он включал:
"compilerOptions": {
...
"lib": ["es2015"],
...
}
Я думаю, что лучше использовать эту библиотеку. Это облегчает сериализацию/десериализацию объекта /JSON.
https://www.npmjs.com/package/@peerlancers/json-serialization