Подтвердить что ты не робот

Typescript сериализация объектов?

Существуют ли какие-либо средства для сериализации/десериализации JSON объектов Typescript, чтобы они не потеряли информацию о типе? Простой JSON.parse(JSON.stringify) имеет слишком много предостережений.

Или я должен использовать adhoc-решения?

4b9b3361

Ответ 1

Используйте интерфейсы для получения сильных типов:

// 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);

И используйте утверждение типа "< > ", если вам нужно.

Ответ 2

Я думаю, что лучший способ справиться с этим - использовать 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());

Таким образом, в отличие от использования интерфейса, этот подход сохраняет методы.

Ответ 3

Ответ AQuirky работает для меня. У вас могут возникнуть проблемы с методом Object.assign. Мне пришлось изменить свой tsconfig.json, чтобы он включал:

"compilerOptions": {
    ...
    "lib": ["es2015"],
    ...
}