2015-11-20 24 views
6

Próbuję zrobić klasę post zawiera atrybuty pocztowych, takich jak „id, tytuł, treść itp. ...maszynopis parse json z klasy i interfejsu

chcę zainicjować klasę z JSON . odpowiedź Używam kątową hTTP, aby uzyskać JSON w maszynopisie

w 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);  
 
    }); 
 
    } 
 
}

uwaga: nadal jestem zagubiony który jest odpowiedni rodzaj dla mojego JSON Czytałem, że maszynopis nie wspiera Mapa jeszcze, jednak pracuje tutaj jako result: {[key:string]: string; };

Starałem się spojrzeć w górę na stackoverflow, znalazłem to pytanie how to cast a json object to a typescript, odpowiedź nie ma nic wspólnego z maszynopisem.

w innym pytaniu Can I create a TypeScript type and use that when AJAX returns JSON data?

odpowiedź mówi o tworzeniu interfejsów w maszynopisie. (., Które nie bardzo rozumiem)

Znalazłem również ta strona generuje interfejsy dla json2ts maszynopisu z JSON, więc próbowałem mój json i mam to:

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; 
 
    } 
 
}

Mam teraz interfejs maszynopisu do mojego JSON-a, ale nie wiem, co dalej!

P: Czy jest to właściwy sposób na parsowanie JSON-a do obiektu klasy w maszynopisie? jeśli tak, jaki jest następny krok, aby klasa została zainicjowana danymi?

Odpowiedz

12

Powinieneś zdecydowanie używać interfejsów do opisu swojego DTO (Data Transfer Object). Wygląda na to, że json2ts wykonał dobrą robotę opisując swoją strukturę JSON. Teraz, ponieważ usługa http stworzony obiekt dla ciebie, nie trzeba tworzyć nowego ... masz tylko oddać go do interfejsu, coś w następujących liniach:

class AppComponent { 
    dataFromServer : RootObject; 

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

Od tego momentu TypeScript będzie chronił przed popełnianiem błędów podczas próby uzyskania dostępu do danych pochodzących z serwera. Na przykład:

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

zadziałało, więc nie ma potrzeby tworzenia niestandardowej klasy dla interfejsu? –

+1

Nie jesteś twórcą tego obiektu, nie ćwicz. Chyba że chcesz zacząć robić akcje (funkcje) z tym obiektem. – gilamran

+1

Ale co, jeśli nie wiem, co zawiera JSON? Jak mogę utworzyć interfejsy dla obiektów, których nie znam? – Kokodoko