【问题标题】:What is the best way to convert JSON to TypeScript Object?将 JSON 转换为 TypeScript 对象的最佳方法是什么?
【发布时间】:2018-06-28 20:13:37
【问题描述】:

我有JSON字符串

const json = '{ "first_name": "John", "last_name": "Doe"}';

还有一个班级User

class User {

  constructor(
    public first_name: string,
    public last_name: string
  ) {
  }

  public getFullName = (): string => {
    return this.first_name + ' ' + this.last_name;
  };
}

当我尝试这个时

const user: User = JSON.parse(json);

console.log(user.first_name); // Works, prints "John"
console.log(user.last_name); // Works, prints "Doe"
console.log(user.getFullName()); //Error: TypeError: user.getFullName is not a function

我知道发生了错误,因为 JSON.parse 只匹配 User 类型,但不匹配其中的方法。

所以为了解决这个问题,我在User 类中编写了一个fromJSON 静态方法来手动解析,

public static fromJSON = (json: string): User => {
    const jsonObject = JSON.parse(json);
    return new User(
      jsonObject.first_name,
      jsonObject.last_name
    );
};

这是我的问题

  1. 这是一个完美的解决方案吗?
  2. 还有比这更好的解决方案吗?
  3. TypeScript 中是否有针对此问题的内置解决方案?

【问题讨论】:

  • 也许真正的问题是您为什么要为 JSON 数据创建 new User() 实例?在您的应用程序中将 JSON 作为数组提供还不够吗?

标签: typescript


【解决方案1】:

这是一个不错的解决方案。更好的方法是使用Object.assign,这样就不必编写所有的分配,因为如果有很多属性,这会失控,但任何一个都可以正常工作。

class User {

    public first_name!: string;
    public last_name!: string;
    constructor(data: Partial<User>) {
        Object.assign(this, data);
    }

    public getFullName (): string {
        return this.first_name + ' ' + this.last_name;
    };

    public static fromJSON = (json: string): User => {
        const jsonObject = JSON.parse(json);
        return new User(jsonObject);
    };  
}

打字稿中没有内置解决方案,Object.assign 最接近它。您可以考虑动态更改构造函数,详细的here,这会将对象转换为类的实例,但不一定性能更好。

【讨论】:

  • 好的。我会调查的。
  • 我找到了一个使用TypeScript Decoratorgithub library。这值得尝试吗?你怎么看?
  • @theapache64 我对这个库的理解是,如果使用装饰器,它会验证 json 对象是否符合接口。它似乎还支持您可能想要的嵌套对象。因此,值得一看,根据我们的用例可能会提供一些有用的功能
  • 是的。在我的真实场景中,我有很深的 json 对象结构。谢谢提香的回复
  • Object.assign 在面向 ES5 时不起作用。您可能希望将this Q&A 纳入您的回复中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
  • 2017-06-09
相关资源
最近更新 更多