【问题标题】:Data object constructor not called when parsing JSON解析 JSON 时未调用数据对象构造函数
【发布时间】:2017-07-08 03:33:10
【问题描述】:

我正在从服务器获取一些数据,然后将其解析为 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 的实例?
  • 是的。对不起,如果我的示例代码有误导性:类型功能是在其他类中实现的,而不是考试本身。考试包含一组元数据对象。

标签: javascript json angular typescript


【解决方案1】:

强制转换只是静态代码分析的提示,但在运行时没有任何影响。

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

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

Exam 类的构造函数将 JSON 分解为其属性。

【讨论】:

  • 我明白了。谢谢!我已经阅读了反序列化的 4 个选项,在这里指出:stackoverflow.com/questions/22885995/…。最后一个选项对我来说似乎是最好的选择。我的 TypeScript 类中的变量名称与 json 字段匹配。我没有任何直接的方法可以将 json 解析为 pojo,然后将值克隆到我的 Typescript 对象中吗?
  • Object.keys(json).map(k =&gt; this[k] = json[k]) 如果 JSON 没有嵌套对象。其实我对这部分不太了解,因为我自己没有使用 TypeScript。
  • 是的,嵌套对象会阻止这种“自动化”方法。谢谢君特!
猜你喜欢
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 2018-08-11
  • 2012-04-15
  • 2015-12-05
  • 2011-04-16
相关资源
最近更新 更多