Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将JSON映射到TS类。若属性是obj并且在JSON中找不到,那个么类应该有空的obbj_Json_Angular_Typescript - Fatal编程技术网

将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
相同的结果。哦!我没读那部分。非常抱歉。然后将你的答案标记为解决方案。谢谢你的帮助!