2017-09-26 2 views
2

J'ai une structure simple dont j'ai besoin pour pouvoir décoder, mais j'ai des problèmes.Elm Simple JSON List Décodage

Ma réponse API ressemble à ceci:

[{"userId":70, "otherField":1, ...}, 
{"userId":70, "otherField":1, ...},  
{"userId":71, "otherField":1, ...}] 

Je suis en train de le décoder comme suit:

type alias SessionResponse = 
    { sessions : List Session 
    } 


type alias Session = 
    { userId : Int 
    } 


decodeSessionResponse : Decoder (List Session) 
decodeSessionResponse = 
    decode Session 
     |> list decodeSession -- Gives an Error 


decodeSession : Decoder Session 
decodeSession = 
    decode Session 
     |> required "userId" int 

Le message d'erreur que je vois est:

The right side of (|>) is causing a type mismatch. 

(|>) is expecting the right side to be a: 

Decoder (Int -> Session) -> Decoder (List Session) 

But the right side is: 

Decoder (List Session) 

It looks like a function needs 1 more argument. 

Comment réparer cette erreur?

Répondre

3

Il y a plusieurs façons d'aborder cela en fonction de ce que vous essayez de faire.

Edit: Sur la base de votre commentaire et une relecture de votre question:

Vous avez indiqué que la réponse de l'API est un tableau de sessions, ce qui signifie que vous pouvez simplement utiliser Json.Decode.map pour mapper un list Session à un SessionResponse:

decodeSessionResponse : Decoder SessionResponse 
decodeSessionResponse = 
    map SessionResponse (list decodeSession) 

réponse d'origine:

Si vous souhaitez faire correspondre la signature de type decodeSessionResponse et renvoyer un Decoder (List Session), vous pouvez simplement retourner list decodeSession.

decodeSessionResponse : Decoder (List Session) 
decodeSessionResponse = 
    list decodeSession 

Ce que je soupçonne que vous préférez retourner un Decoder SessionResponse, ce qui pourrait être défini comme tel:

decodeSessionResponse : Decoder SessionResponse 
decodeSessionResponse = 
    decode SessionResponse 
     |> required "sessions" (list decodeSession) 
+0

Merci, je préférerais utiliser la deuxième approche, mais étant donné que la liste n'est pas étiqueté dans la réponse JSON je ne peux pas le faire fonctionner. – James

+0

J'ai mis à jour la réponse pour la comparer aux entrées que vous avez fournies –