【问题标题】:Map JSON to TS Class. If property is an obj and not found in JSON, class should have empty obbj将 JSON 映射到 TS 类。如果属性是一个 obj 并且在 JSON 中找不到,则类应该有空 obj
【发布时间】:2017-11-15 17:15:28
【问题描述】:

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

我定义了一个类,比如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"}

注意这里没有b。而且a 也不见了propB

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

P.S:这里的用例是我正在编写一个 Angular2 应用程序,其中使用表单输入属性。如果我在 html (obj?.prop) 中使用 elvis 运算符,因为 obj 没有该属性,所以永远不会设置该属性的值。如果我不使用猫王,那么旧的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));
  }
}

【问题讨论】:

  • 您尝试过使用rsjx 库吗?它提供了一个.map 选项,用于将从后端返回的 JSON 映射到前端

标签: json angular typescript


【解决方案1】:

您可以将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 的结果,这样您就不会在视图中的各种绑定之间共享同一个对象。

编辑:正如 cmets 中所述,下划线之类的库提供了 _.merge 之类的函数,可以合并和深度克隆。

【讨论】:

  • 我使用Object.assign({}, defaultObj, json) 尝试了您的建议。不工作。但是,我注意到一个关键字 merging the properties of both objects,这让我想起了 lodash 中的 _.merge。快! _.merge(new Model(),json) 对我有用。
  • 我想知道为什么它不起作用。我的简单示例有效吗?你的情况发生了什么?
  • 是的,您的示例确实有效。但它只适用于一个级别。就我而言,我有一个深层嵌套的 JSON,所以我想我必须遍历每个级别并使用 .assign()
  • 对,这就是为什么我说要深度克隆Object.assign 的结果,这与您调用_.merge 的结果基本相同。
  • 哦!我错过了阅读那部分。非常抱歉。然后将您的答案标记为解决方案。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 2020-02-10
  • 1970-01-01
  • 2016-10-22
相关资源
最近更新 更多