我正在为项目使用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解析为工具集合(具有适当类型)的选项?
答案 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);