2016-12-20 4 views
2

Ich übergebe eine Reihe von Objekten über Ports in meine Elm App. Ein Beispiel für ein eines der Objekte im Array:Objekte in JSON-Decoder über Elm-Ports

{ 
    FullName: 'Foo Bar', 
    Location: 'Here' 
} 

Wie Sie die Schlüssel im Objekt beginnen mit einem Kapital sehen können, also muss ich diese in Elm dekodieren. In meinem Elm Code habe ich ein type für die Person

type alias Person = 
    { fullName : String 
    , location : String 
    } 

und Hafen:

port getPeople : (List Json.Decode.Value -> msg) -> Sub msg 

Endlich habe ich einen Decoder (I Elm Decode Pipeline verwende), um die Daten in die Person Art zu analysieren.

peopleDecoder : Decoder Person 
peopleDecoder = 
    decode Person 
     |> required "FullName" string 
     |> required "Location" string 

Meine Frage ist, wie kann ich die eingehenden Port-Daten in den Person Typen zuordnen? Ich weiß, dass ich das in JS machen könnte, aber ich würde es lieber in meinem Elm-Code machen.

+0

Was ist 'Worker' in Ihrem Beispiel' peopleDecoder'? –

+0

Das war ein Tippfehler, jetzt behoben. – joshuahornby10

Antwort

4

Json.Decode.decodeValue kann eine Json.Decode.Value decodieren, aber es gibt eine Result String (List Person) zurück.

Wenn Sie definiert Ihre Nachricht wie folgt aus:

type Msg 
    = GetPeople (Result String (List Person)) 

Sie Ihr Abonnement wie folgt gesetzt werden könnte:

port getPeople : (Json.Decode.Value -> msg) -> Sub msg 

subscriptions : Model -> Sub Msg 
subscriptions model = 
    getPeople (GetPeople << decodeValue (list peopleDecoder)) 

(Beachten Sie, dass das erste Argument im Hafen wurde geändert, um nur ein Value statt List Value)

Verwandte Themen