使用Typescript中的数组反序列化JSON对象

时间:2016-11-06 14:25:32

标签: json typescript deserialization

我想在JSON中反序列化Typescript对象。我发现这个相关的question我想使用已接受答案的approach 4。但是我不确定这是否适用于我的情况,因为该对象具有arrays其他对象的成员,所以array中的对象也是如此。此外,我想使用一种通用的方法/方法,即使不知道对象依赖关系的结束位置,也会对对象进行反序列化。对象结构如下:

class Parent {

s: string;
x: number;
children : Array<Child1>
...

} 

class Child1 {

t: string;
y: number;
children : Array<Child2>
...

}

class Child2 {

k: string;
z: number;
children : Array<Child3>;
...

}

...

如何反序列化这些类型的对象?即使采用将对象结构的结尾视为理所当然的方法,我也会感到满意。

2 个答案:

答案 0 :(得分:2)

我不确定我是否理解您的全部要求,但您说要使用的方法基本上使每个类负责反序列化自身。因此,如果父知道它有Child1数组,它知道它可以遍历json中的children数组,然后调用Child1来反序列化每个子节点。 Child1然后可以为其子项执行相同操作,依此类推:

class Parent {
    s: string;
    x:number;
    children: Child1[] = [];

    deserialize(input) {
        this.s = input.s;
        this.x = input.x;
        for(let child of input.children){
            this.children.push(new Child1().deserialize(child))
        }
        return this;
    }
}

class Child1{
    t: string;
    y: number;
    children: Child2[] = []
    deserialize(input) {
        this.t = input.t;
        this.y = input.x;
        for(let child of input.children){
            this.children.push(new Child2().deserialize(child))
        }

        return this;
    }
}

class Child2{
    deserialize(input) {
        //...
        return this;
    }

}

答案 1 :(得分:0)

为避免列出所有属性,我使用了link

前提是要有一个类可以实现的可反序列化的接口:

export interface Deserializable {
   deserialize(input: any): this;
}

然后我们使用Object.assign。

课程:

class Parent {
    s: string;
    x: number;
    children: Child1[] = [];

    deserialize(input) {
        Object.assign(this, input);
        let deserializedChildren: Child1[] = [];
        for(let child of input.children){
            deserializedChildren.push(new Child1().deserialize(child))
        }
        this.children = deserializedChildren;
        return this;
    }
}

class Child1{
    t: string;
    y: number;

    deserialize(input) {
        Object.assign(this, input);
        return this;
    }
}