2015-11-20 4 views
6

Я пытаюсь сделать класс Сообщения содержит почтовые атрибуты, такие как «идентификатор, название, содержание ... и др.машинопись разбор JSON с классом и интерфейсом

Я хочу, чтобы инициализировать класс из JSON . ответ я использую угловую-HTTP, чтобы получить JSON в машинописи

в APP.TS:

class AppComponent { 
 

 
    result: { [key: string]: string; }; 
 
    
 
    map: Map<Object,Object>; 
 
    
 
    constructor(http: Http) { 
 
    http.get('http://localhost/wptest/wp-json/wp/v2/posts').subscribe(res => { 
 
     
 
     this.result = <any>res.json(); 
 
     this.map = <any>res.json(); 
 
     
 
     console.log(this.result); 
 
     console.log(this.map);  
 
    }); 
 
    } 
 
}

примечание: Я до сих пор путают о том, какие это правильный тип для моего JSON я прочитал, что машинопись не поддерживает карту еще, однако он работает здесь, как result: {[key:string]: string; };

Я попытался посмотреть на stackoverflow, я нашел этот вопрос how to cast a json object to a typescript, ответ не имеет ничего общего с машинописным текстом.

другой вопрос Can I create a TypeScript type and use that when AJAX returns JSON data?

ответ говорят о создании интерфейсов в машинописи. (., Которые я не совсем понимаю)

Я также нашел этот сайт json2ts генерирует машинопись интерфейсы из JSON, поэтому я попытался мой и я JSON получил это:

declare module namespace { 
 

 
    export interface Guid { 
 
     rendered: string; 
 
    } 
 

 
    export interface Title { 
 
     rendered: string; 
 
    } 
 

 
    export interface Content { 
 
     rendered: string; 
 
    } 
 

 
    export interface Excerpt { 
 
     rendered: string; 
 
    } 
 

 
    export interface Self { 
 
     href: string; 
 
    } 
 

 
    export interface Collection { 
 
     href: string; 
 
    } 
 

 
    export interface Author { 
 
     embeddable: boolean; 
 
     href: string; 
 
    } 
 

 
    export interface Reply { 
 
     embeddable: boolean; 
 
     href: string; 
 
    } 
 

 
    export interface VersionHistory { 
 
     href: string; 
 
    } 
 

 
    export interface Links { 
 
     self: Self[]; 
 
     collection: Collection[]; 
 
     author: Author[]; 
 
     replies: Reply[]; 
 
    } 
 

 
    export interface RootObject { 
 
     id: number; 
 
     date: Date; 
 
     guid: Guid; 
 
     modified: Date; 
 
     modified_gmt: Date; 
 
     slug: string; 
 
     type: string; 
 
     link: string; 
 
     title: Title; 
 
     content: Content; 
 
     excerpt: Excerpt; 
 
     author: number; 
 
     featured_image: number; 
 
     comment_status: string; 
 
     ping_status: string; 
 
     sticky: boolean; 
 
     format: string; 
 
     _links: Links; 
 
    } 
 
}

Теперь у меня есть интерфейс для моего JSON, но я не знаю, что делать дальше!

В: Правильно ли это разбор JSON для объекта класса в машинописном тексте? если да, то каков следующий шаг, чтобы получить класс, инициализированный данными?

ответ

12

Вы должны обязательно использовать интерфейсы для описания вашего DTO (объекта передачи данных). Похоже, json2ts проделал хорошую работу по описанию вашей структуры JSON. Теперь, потому что служба HTTP создан объект для вас, вы не должны создать новый ... у вас есть только бросить его на интерфейс, что-то вроде в следующих строках:

class AppComponent { 
    dataFromServer : RootObject; 

    http.get('http://localhost/wptest/wp-json/wp/v2/posts').subscribe(res => { 
    this.dataFromServer = <RootObject>res.json(); 
    }); 
} 

С этого момента TypeScript защитит вас от ошибок при попытке доступа к любым данным, поступающим с сервера. Например:

this.dataFromServer.age = 45; // Error: age doesn't exist in the RootObject interface 
this.id = "Hello"; // Error, id was is a number, and you try to put string into it. 
this.id = 100; // will be just fine. 
+0

он работал, поэтому нет необходимости создавать пользовательский класс для интерфейса? –

+1

Вы не создатель этого объекта, не делайте этого класса. Если вы не хотите начинать делать действия (функции) с этим объектом – gilamran

+1

Но что, если я не знаю, что будет содержать JSON? Как я могу создать интерфейсы для объектов, которые я не знаю? – Kokodoko

Смежные вопросы