将JSON映射到TS类。若属性是obj并且在JSON中找不到,那个么类应该有空的obbj
我无法为我面临的问题找到一个合适的标题。因此,我将尽可能详细地解释这个问题 我定义了一个类,比如说将JSON映射到TS类。若属性是obj并且在JSON中找不到,那个么类应该有空的obbj,json,angular,typescript,Json,Angular,Typescript,我无法为我面临的问题找到一个合适的标题。因此,我将尽可能详细地解释这个问题 我定义了一个类,比如说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();
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();
}
}
export class ObjA{
propA:string;
propB:ObjD;
constructor(){
this.propB = new ObjD();
}
}
export class ObjB{
propA:string;
propB:number;
}
export class ObjC{
propA:string;
propB:number;
}
对于这个问题,子类保持简单
ObjA.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();
}
}
export class ObjA{
propA:string;
propB:ObjD;
constructor(){
this.propB = new ObjD();
}
}
export class ObjB{
propA:string;
propB:number;
}
export class ObjC{
propA:string;
propB:number;
}
ObjB.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();
}
}
export class ObjA{
propA:string;
propB:ObjD;
constructor(){
this.propB = new ObjD();
}
}
export class ObjB{
propA:string;
propB:number;
}
export class ObjC{
propA:string;
propB:number;
}
ObjC.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();
}
}
export class ObjA{
propA:string;
propB:ObjD;
constructor(){
this.propB = new ObjD();
}
}
export class ObjB{
propA:string;
propB:number;
}
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(newmodel(),json)
可以
{a:{propA:"some val"},c:{propB:12},d:"blah"}
请注意此处缺少b
。而且a
缺少propB
因此,我的问题是,如何映射json,以便在json中缺少任何属性(即对象)时,只创建一个空对象?(我愿意使用loadash等UTIL)
这里的用例是我正在编写一个Angular2应用程序,其中属性是使用表单输入的。如果我在html中使用elvis运算符(obj?.prop),因为obj没有该属性,所以该属性的值永远不会设置。如果我不使用elvis,那么就会抛出由来已久的undefined
样本表格:
...
<input [(ngModel)]="model.a.propA"/>
<input [(ngModel)]="model.a.propB"/>
<input [(ngModel)]="model.b.propA"/>
<input [(ngModel)]="model.b.propB"/>
.
.
.
...
您可以使用
对象。将与您创建的默认对象组合使用。最终将合并两个对象的属性,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"}
但是,这只是defaultObj
和json
中属性的浅拷贝。由于某些属性是对象,因此您可能需要深度克隆对象的结果。分配
,这样您就不会在视图中的各种绑定之间共享同一个对象
Edit:如评论中所述,下划线等库提供了类似于.merge
的函数,可以合并和深度克隆。您是否尝试过使用rsjx
库?它提供了一个.map
选项,用于将从后端返回的JSON映射到前端。我使用Object.assign({},defaultObj,JSON)
尝试了您的建议。不起作用。但是,我注意到一个关键字合并了两个对象的属性
,这让我想起了lodash中的u.merge。普雷斯托。merge(newmodel(),json)帮了我的忙。我想知道为什么它不起作用。我的简单示例有效吗?你的案例发生了什么?是的,你的例子确实有效。但它只在一个层次上起作用。在我的例子中,我有一个深度嵌套的JSON,所以我想我必须迭代每个级别并使用。assign()
对,这就是为什么我说要深度克隆Object.assign的结果。assign
,这基本上给出了与调用..merge
相同的结果。哦!我没读那部分。非常抱歉。然后将你的答案标记为解决方案。谢谢你的帮助!