首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从JSON转换时创建缺少的字段

从JSON转换时创建缺少的字段
EN

Stack Overflow用户
提问于 2017-11-12 12:55:40
回答 2查看 334关注 0票数 1

如果我有一个类,比如:

代码语言:javascript
运行
复制
export interface Results {
  xrf: any;
  ftir: any;
  level: any;
}

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

和一个JSON对象,如:

代码语言:javascript
运行
复制
{
  "Results": {
    "xrf" : "xrfresult",
    "level": "21"
  },
  "remark" : "Test 1"
}

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

EN

回答 2

Stack Overflow用户

发布于 2017-11-12 15:51:53

并非接口的所有属性都是必需的。有些在特定条件下存在,或者根本就不存在。这些可选属性在创建像“选项包”这样的模式时很流行,在这种模式中,您将一个对象传递给一个只填充了几个属性的函数。

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

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

代码语言:javascript
运行
复制
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);
  }

}
票数 0
EN

Stack Overflow用户

发布于 2017-11-12 17:52:37

不,没有内置的方法可以做到这一点。JSON对普通对象进行操作。您的类型批注在运行时没有任何影响,所有类型都会被擦除,并且只允许这样做,因为JSON.parse不返回特定类型,而是返回any

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

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

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

您需要自己提供默认值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47245588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档