首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用JSON对象初始化TypeScript对象?

如何使用JSON对象初始化TypeScript对象?
EN

Stack Overflow用户
提问于 2014-04-06 03:52:36
回答 14查看 364.1K关注 0票数 240

我从对REST服务器的AJAX调用接收到一个JSON对象。这个对象的属性名与我的TypeScript类(这是this question的后续类)相匹配。

初始化它的最佳方式是什么?我认为this不会工作,因为类(& JSON object)的成员是对象列表,成员是类,而这些类的成员是列表和/或类。

但我更喜欢这样一种方法,即查找成员名称并将它们分配给其他成员,根据需要创建列表和实例化类,这样我就不必为每个类中的每个成员编写显式代码(有很多!)

EN

回答 14

Stack Overflow用户

发布于 2016-09-10 15:10:49

你可以使用Typescript我不知道这是什么时候添加的,我现在使用的是Typescript 2.0.2,这似乎是一个ES6特性。

代码语言:javascript
复制
client.fetch( '' ).then( response => {
        return response.json();
    } ).then( json => {
        let hal : HalJson = Object.assign( new HalJson(), json );
        log.debug( "json", hal );

这是HalJson

代码语言:javascript
复制
export class HalJson {
    _links: HalLinks;
}

export class HalLinks implements Links {
}

export interface Links {
    readonly [text: string]: Link;
}

export interface Link {
    readonly href: URL;
}

下面是chrome所说的

代码语言:javascript
复制
HalJson {_links: Object}
_links
:
Object
public
:
Object
href
:
"http://localhost:9000/v0/public

所以你可以看到它不是递归赋值的

票数 49
EN

Stack Overflow用户

发布于 2017-09-09 09:14:12

我已经创建了一个工具来生成TypeScript接口和一个运行时“类型映射”,用于根据JSON.parsets.quicktype.io的结果执行运行时类型检查

例如,给定以下JSON:

代码语言:javascript
复制
{
  "name": "David",
  "pets": [
    {
      "name": "Smoochie",
      "species": "rhino"
    }
  ]
}

quicktype生成以下TypeScript接口和类型映射:

代码语言:javascript
复制
export interface Person {
    name: string;
    pets: Pet[];
}

export interface Pet {
    name:    string;
    species: string;
}

const typeMap: any = {
    Person: {
        name: "string",
        pets: array(object("Pet")),
    },
    Pet: {
        name: "string",
        species: "string",
    },
};

然后我们根据类型映射检查JSON.parse的结果:

代码语言:javascript
复制
export function fromJson(json: string): Person {
    return cast(JSON.parse(json), object("Person"));
}

我遗漏了一些代码,但您可以尝试使用quicktype查看详细信息。

票数 15
EN

Stack Overflow用户

发布于 2018-11-29 03:52:10

对于简单的对象,我喜欢这个方法:

代码语言:javascript
复制
class Person {
  constructor(
    public id: String, 
    public name: String, 
    public title: String) {};

  static deserialize(input:any): Person {
    return new Person(input.id, input.name, input.title);
  }
}

var person = Person.deserialize({id: 'P123', name: 'Bob', title: 'Mr'});

利用在构造函数中定义属性的功能可以使其简洁。

这将为您提供一个类型化的对象(与使用Object.assign或某些变体的所有答案相比,这将为您提供一个对象),并且不需要外部库或装饰器。

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

https://stackoverflow.com/questions/22885995

复制
相关文章

相似问题

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