2017-09-26 92 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響應是會話的陣列,這意味着你可以使用Json.Decode.map映射一個list Session到一個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

我已更新答案,針對您提供的輸入進行工作 –