Typescript将json反序列化为具有多种类型的集合

时间:2016-06-29 13:21:19

标签: json serialization typescript

我正在为项目使用typescript,需要将集合序列化为json,将其保存到文件中,然后将该文件反序列化为类似的集合。该集合看起来像:

elements: Array<tool>

我的工具界面如下:

export interface tool {
    name: string;
    draw(context:any);
}

并且工具实现如下:

export class textTool implements tool {
    name: string;
    fontSize:number;
    fontType:string;
    draw(context:any){
        // draws the control...
    }
}

我的工具界面实现很少:textTool,imageTool和rectangleTool。我需要解决的问题是,当我将文件内容反序列化为一个工具集合时,我只得到一个常规对象而不是textTool的实例。

我使用JSON.stringify(elements)创建了一个json,并使用JSON.parse(jsonText)来反序列化。

据我所知,解析器无法知道应该创建哪个类型的实例,因为json文本没有关于它的信息。我想添加一个字段或其他东西来确定我需要哪个类实例并手动“新”&#39;那个班。任何我不需要手动将json解析为工具集合(具有适当类型)的选项?

2 个答案:

答案 0 :(得分:6)

正如你所说,你可以添加一个字段{"doNotReplaceKey":"bábögêjírù","replaceValueKey":"babogejiru","anotherNotReplaceKey":"bábögêjírù"} ,在type-string和implementation-class之间创建一个映射,然后转换代码就会很简单:

type

*克隆代码非常简单,但对于普通对象来说已经足够了。

答案 1 :(得分:2)

对于普通对象试试:

function deserialize<T>(json): T[] {
    let collection: T[] = [];
    json.map((item: T) => {
        collection.push(item);
    });
    return collection;
}

并称之为:

let tools: tool[] = deserialize<textTool>(json);