2015-11-20 26 views
6

Sto cercando di fare una classe Messaggio contiene attributi pubblicare quali "id, titolo, il contenuto ... ecc.dattiloscritto JSON parsing con classe e l'interfaccia

voglio inizializzare la classe da un JSON . risposta sto utilizzando angolare http per ottenere JSON a macchina

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

nota: Sono ancora confusi su quale è il tipo giusto per il mio JSON ho letto che dattiloscritto non sta sostenendo Mappa ancora, ma si sta lavorando qui come result: {[key:string]: string; };

ho provato a guardare in alto su stackoverflow, ho trovato questa domanda how to cast a json object to a typescript, la risposta non ha nulla a che fare con dattiloscritto.

in un'altra domanda Can I create a TypeScript type and use that when AJAX returns JSON data?

la risposta sta parlando di creazione di interfacce a macchina. (. Che non ho del tutto capito)

Ho trovato anche questo sito per json2ts genera interfacce dattiloscritto da JSON, così ho provato la mia JSON e ho ottenuto questo:

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

Ora ho un'interfaccia dattiloscritto per il mio JSON, ma non so cosa fare dopo!

D: È questo il modo giusto per analizzare JSON in un oggetto di classe in dattiloscritto? se sì qual è il prossimo passo per ottenere la classe inizializzata con i dati?

risposta

12

Si consiglia di utilizzare le interfacce per descrivere il DTO (oggetto di trasferimento dati). Sembra che lo json2ts abbia fatto un buon lavoro nella descrizione della struttura JSON. Ora, perché il servizio http creato l'oggetto per voi, non c'è bisogno di crearne uno nuovo ... basta lanciarlo alla vostra interfaccia, qualcosa di simile nelle righe seguenti:

class AppComponent { 
    dataFromServer : RootObject; 

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

Da quel momento in poi TypeScript ti proteggerà da eventuali errori quando tenti di accedere a qualsiasi dato proveniente dal server. Ad esempio:

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

ha funzionato, quindi non è necessario creare una classe personalizzata per l'interfaccia? –

+1

Non sei il creatore di questo oggetto, non fare classi. A meno che non vogliate iniziare a fare azioni (funzioni) con questo oggetto – gilamran

+1

Ma cosa succede se non so cosa conterrà il JSON? Come posso creare interfacce per oggetti di cui non conosco il contenuto? – Kokodoko