解析JSON时未调用数据对象构造函数

3
我将从服务器获取一些数据,然后将其解析为TypeScript类。我尝试使用一些继承 - 每个类都需要能够报告其类型。以下是其工作原理:
这是基类。
import { PageElementType } from './page-element-type'

export class PageElement {
    pageElementType: PageElementType;
    constructor(aPageElementType: PageElementType) { 
        this.pageElementType = aPageElementType; 
    }
}

这是一个派生类。

import { PageElement } from './page-element.model'
import { PageElementType } from './page-element-type'

export class Metadata extends PageElement {
    id: number;
    body: string;

    constructor(){
        super(PageElementType.metadata);
    }
}

这是我调用的解析数据的服务函数。
getExam(){
    let exam = this.http.get('http://orangeberry.hopto.org/api/Exam/1')
    .map((response:Response) => <Exam>response.json())
    .do(data => console.log(data));
    return exam;
}

看起来我得到了一些普通对象。我想要有意义的、实用的对象,这些对象实际上遵循类定义。对于我的情况,最简单、最直接的方法是什么?


你期望一个 Exam 的实例吗? - Günter Zöchbauer
是的。如果我的示例代码有误导性,我很抱歉:类型功能是在其他类中实现的,而不是在Exam本身中实现的。Exam包含一个Metadata对象数组。 - Dean Panayotov
1个回答

1

类型转换只是静态代码分析的提示,对运行时没有任何影响。

如果你想要该值成为某个类的实例,你需要自己创建这样一个实例:

.map((response:Response) => new Exam(response.json()))

Exam类的构造函数中,将JSON解析为其属性。


我明白了,谢谢!我已经阅读了这里指出的4种反序列化选项:https://dev59.com/gmAh5IYBdhLWcg3wDfkW。最后一种选项对我来说似乎是最好的。我的TypeScript类中的变量名称与json字段匹配。难道没有什么简单的方法可以让我将json解析为pojo,然后将值克隆到我的TypeScript对象中吗? - Dean Panayotov
如果JSON没有嵌套对象,则返回“Object.keys(json).map(k => this[k] = json[k])”。实际上,我对此部分不太了解,因为我自己没有使用TypeScript。 - Günter Zöchbauer
是的,嵌套对象将阻止这种“自动化”方法。谢谢Günter! - Dean Panayotov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接