从JSON

时间:2017-11-12 04:55:40

标签: typescript

如果我有一个类如:

export interface Results {
  xrf: any;
  ftir: any;
  level: any;
}

export class myClass{
  Results: Results;
  remark: string;
}

和一个JSON对象,如:

{
  "Results": {
    "xrf" : "xrfresult",
    "level": "21"
  },
  "remark" : "Test 1"
}

如果我使用let obj: myClass= JSON.parse(jsonobj)解析对象,则对象缺少字段ftir。有没有办法从没有打字稿类的所有字段的JSON对象中自动创建缺少的字段?

2 个答案:

答案 0 :(得分:0)

并非所有接口的属性都是必需的。有些在某些条件下存在或根本不存在。这些可选属性在创建“选项包”等模式时非常流行,您可以将对象传递给只填充了几个属性的函数。

具有可选属性的接口与其他接口类似,每个可选属性由?在声明中的属性名称的末尾。

在你的ftir中是可选的,因为输入对象没有这个属性。如果你在对象分配后尝试访问ftir,你将得到未定义。

export interface Results {
  xrf?: any;
  ftir?: any;
  level?: any;
}

export class myClass{
  Results: Results;
  remark: string;
}


export class HomePage {
  results : Results;
  jsonObj : myClass;
  jsonString : any;
  ftir : any;
  constructor(public navCtrl: NavController) {
    this.jsonObj={
  "Results": {
    "xrf" : "xrfresult",
    "level": "21"
  },
  "remark" : "Test 1"
}

this.ftir=this.jsonObj.Results.ftir
  this.jsonString=JSON.stringify(this.jsonObj);
  console.log(this.ftir);
  }

}

答案 1 :(得分:0)

没有内置的方法可以做到这一点。 JSON在普通对象上运行。您的类型注释在运行时没有影响,所有类型都被删除,并且只允许JSON.parse没有返回特定类型,它返回any

在对反序列化值的引用上使用类类型的注释是一个非常糟糕的主意。

虽然理论上可以实现实例化类的功能,但您需要在每个调用站点手动执行此操作或更改全局JSON对象的行为。后一种方法实际上是不可行的,因为你会破坏你的依赖关系,前一种方法是维护噩梦,一旦你不可避免地引入嵌套值,就会引入非凡的复杂性。

因此,您不应该使用类而是使用接口。此外,正如在另一个答案中所建议的那样,您应该注释可能缺席的成员作为可选项。

您需要自己提供默认值。