2016-09-04 6 views
6

Ich habe vor kurzem versucht, Daten vom Server mit Elms Http-Modul zu bekommen, und ich bin mit der Dekodierung Json zu benutzerdefinierten Typen in Elm stecken.Decode Json Array mit Objekten in Elm

Meine JSON sieht wie folgt aus:

[{ 
    "id": 1, 
    "name": "John", 
    "address": { 
     "city": "London", 
     "street": "A Street", 
     "id": 1 
    } 
}, 
{ 
    "id": 2, 
    "name": "Bob", 
    "address": { 
     "city": "New York", 
     "street": "Another Street", 
     "id": 1 
    } 
}] 

Welche decodiert werden sollten:

type alias Person = 
{ 
id : Int, 
name: String, 
address: Address 
} 

type alias Address = 
{ 
id: Int, 
city: String, 
street: String 
} 

Was ich bisher gefunden ist, dass ich brauche eine Decoder-Funktion schreiben:

personDecoder: Decoder Person 
personDecoder = 
    object2 Person 
    ("id" := int) 
    ("name" := string) 

Das für die ersten beiden Eigenschaften, aber wie ich die verschachtelte Address-Eigenschaft integrieren und wie kombinieren Sie dies zu dekodieren t Die Liste?

Antwort

14

Sie müssen zuerst eine Adresse Decoder ähnlich wie Ihre Person Decoder

Edit: Upgraded zu Elm 0,18

import Json.Decode as JD exposing (field, Decoder) 

addressDecoder : Decoder Address 
addressDecoder = 
    JD.map3 Address 
    (field "id" int) 
    (field "city" string) 
    (field "street" string) 

Dann Sie, dass für das Feld "Adresse" verwenden können:

Eine Liste von Personen kann wie folgt entschlüsselt werden:

personListDecoder : Decoder (List Person) 
personListDecoder = 
    JD.list personDecoder 
+0

Ok, danke, aber wie kann ich sie kombinieren, um eine Liste von Personen zu dekodieren? – rubiktubik

+1

Ich habe die Antwort aktualisiert, um den Listendecoder einzuschließen –

+0

Danke! Sehr schöne Lösung! – rubiktubik