gpt4 book ai didi

json - 将 JSON 映射到 TS 类。如果 property 是一个对象并且在 JSON 中找不到,类应该有空 obj

转载 作者:太空狗 更新时间:2023-10-29 18:25:11 24 4
gpt4 key购买 nike

我无法为我面临的问题想出一个合适的标题。所以我会尽可能详细地解释这个问题。

我定义了一个类 Model.ts

export class Model{
a:ObjA;
b:ObjB;
c:ObjC;
d:string;
e:boolean;
constructor(){
this.a = new ObjA();
this.b = new ObjB();
this.c = new ObjC();
}
}

子类对于问题保持简单ObjA.ts

export class ObjA{
propA:string;
propB:ObjD;
constructor(){
this.propB = new ObjD();
}
}

ObjB.ts

export class ObjB{
propA:string;
propB:number;
}

ObjC.ts

export class ObjC{
propA:string;
propB:number;
}

现在从服务中,我得到以下 JSON

{a:{propA:"some val"},c:{propB:12},d:"blah"}

我想要的是能够将 JSON 分配给类 Model 以便我得到这个

{a:{propA:"some val",propB:{}},b:{},c:{propB:12},d:"blah"}

使用 Object.assign(new Model(),json) 给我

{a:{propA:"some val"},c:{propB:12},d:"blah"}

Note the absense of b here. And also a is missing propB

所以我的问题是,如何映射 json,以便如果 json 中缺少作为对象的任何属性,它只会创建一个空对象? (我愿意使用 loadash 和此类实用程序)

P.S:这里的用例是我正在编写一个 Angular2 应用程序,其中使用表单输入属性。如果我在 html (obj?.prop) 中使用 elvis 运算符,因为 obj 没有该属性,因此永远不会设置该属性的值。如果我不使用 elvis,则会抛出旧的 undefined

示例表格:

...
<input [(ngModel)]="model.a.propA"/>
<input [(ngModel)]="model.a.propB"/>
<input [(ngModel)]="model.b.propA"/>
<input [(ngModel)]="model.b.propB"/>
.
.
.
...

对应的*.ts组件

class Component implements OnInit{
....
model:Model = new Model();
ngOnInit(){
getData().subscribe(res=>Object.assign(model,res));
}
}

最佳答案

您可以将 Object.assign 与您创建的默认对象结合使用。您最终将合并两个对象的属性,JSON 覆盖默认值:

let defaultObj  = { a: "default value a", b: "default value b" };

let json = { a: "json value a" };

let model = Object.assign({}, defaultObj, json);

结果:

{a: "json value a", b: "default value b"}

但是,这只是 defaultObjjson 属性的浅拷贝。由于您的一些属性是对象,您可能想要深度克隆 Object.assign 的结果,这样您就不会在 View 中的各种绑定(bind)之间共享同一个对象。

编辑:正如评论中提到的,像 underscore 这样的库提供了像 _.merge 这样的函数,它可以合并和深度克隆。

关于json - 将 JSON 映射到 TS 类。如果 property 是一个对象并且在 JSON 中找不到,类应该有空 obj,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44529749/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com