如果我有一个类如:
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对象中自动创建缺少的字段?
答案 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
对象的行为。后一种方法实际上是不可行的,因为你会破坏你的依赖关系,前一种方法是维护噩梦,一旦你不可避免地引入嵌套值,就会引入非凡的复杂性。
因此,您不应该使用类而是使用接口。此外,正如在另一个答案中所建议的那样,您应该注释可能缺席的成员作为可选项。
您需要自己提供默认值。