使用TypeScript解析复杂的json对象

阿德里安·托里斯

如何使用TypeScipt解析复杂的json对象?

我有一个客户对象,有一些发票。

这是我的模型:

export class Customer {
    public id: string;
    public name: string;
    public invoices: CustomerInvoice[];

    get invoicesCount(): number {
        if (this.invoices== null) {
            return 0;
        }
        return this.invoices.length;
    }

     constructor() {
     }
}

export class CustomerInvoice {
     public id: number;

     constructor() {
     }
}

在我的服务中,我有:

ngOnInit() {
    if (this.id != null) {
        this.dataService.getCustomer(this.id).subscribe(data => {
            this.customer = data;
        },
            err => console.log(err));
    }
}

客户数据很好(我的客户ID,姓名等具有一些值),但是发票为空。

json是正确的,data.Invoices.length返回一个数字。

约翰·威兹

如何使用TypeScipt解析复杂的json对象?

假设你的意思JSON解析成实际的类实例,而不是简单的JavaScript对象,打字稿不发货此功能关闭的,现成的

您可以创建使用接口声明中,你可以做一个类型断言(而不是类型-)在一定程度上模拟天生类型安全,如果在JSON是可信的,但仅此而已-我不知道原生工具序列化一个JSON实际用户定义类型的实例。

interface ICustomerInvoice {
    id: number;
}

interface ICustomer {
    id: string;
    name: string;
    invoices: ICustomerInvoice[];
}

var customer: ICustomer = JSON.parse(json) as ICustomer;

但是,出于同样明显的原因,我开始将TypedJSON组合在一起,以将该功能引入TypeScript。您可以使用JsonObject和JsonMember装饰器注释您的类和成员:

@JsonObject
export class CustomerInvoice {
    @JsonMember
    public id: number;
}

@JsonObject
export class Customer {
    @JsonMember
    public id: string;

    @JsonMember
    public name: string;

    @JsonMember({ elementType: CustomerInvoice })
    public invoices: CustomerInvoice[];

    get invoicesCount(): number {
        if (this.invoices== null) {
            return 0;
        }
        return this.invoices.length;
    }
}

要反序列化JSON字符串,可以使用TypedJSON.parse而不是JSON.parse,getter也将按预期出现:

var customer = TypedJSON.parse(json, Customer);
typeof customer.invoicesCount; // "number"    

这是推荐与使用ReflectDecorators(但不要求)。如果选择跳过此建议,则还需要为成员指定“类型”设置,例如:

@JsonMember({ type: String })
public id: string;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章