2017-09-26 17 views
2

私はデコードできる必要があるシンプルな構造を持っていますが、私は問題があります。ElmシンプルなJSONリストのデコード

私のAPIの応答は次のようになります。

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

私は次のようにそれを解読しようとしている:

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 

私が見ているエラーメッセージは次のとおりです。

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. 

このエラーを解決するにはどうすればよいですか?

答えて

3

あなたがしようとしていることに基づいてこれにアプローチする方法はいくつかあります。

編集:あなたのコメントや質問の再読み込みをもとに

あなたはAPIレスポンスはあなただけlist SessionをマッピングするためにJson.Decode.mapを使用できることを意味セッションの配列であることを指摘SessionResponse

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

オリジナル回答:

decodeSessionResponseのタイプシグネチャと一致させてDecoder (List Session)を返す場合は、単にlist decodeSessionを返すことができます。私は疑う何

decodeSessionResponse : Decoder (List Session) 
decodeSessionResponse = 
    list decodeSession 

あなたではなく、このようなとして定義することができDecoder SessionResponseを返すだろうということです。

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

ありがとうございました、私はむしろ第二のアプローチを使用しますが、リストではありませんので、 JSONレスポンスでラベル付けされていますが、動作させることはできません。 – James

+0

あなたが提供した入力に対して作業するための回答を更新しました –