2016-12-30 89 views
0

我正在做一個http請求,並且我的響應是一個對象數組。每個對象如下Elm JSON解碼器對象陣列

obj = { 
    title: "Some Title", 
    words: [ "word1", "word2", "word3", "word4" ] 
} 

這裏是我的解碼器至今:

type alias ThisRes = List ResObj 


type alias ResObj = 
    title: String 
    words: List String 


decoded : Decoder ThisRes 
decoded = 
    decode ThisRes 

我似乎無法得到正確的解碼器,並可以提供將不勝感激任何幫助。

回答

3
obj = 
    """ 
    { 
     "title": "Some Title", 
     "words": [ "word1", "word2", "word3", "word4" ] 
    } 
    """ 


type alias ResObj = 
    { title : String, words : List String } 


objDecoder = 
    map2 ResObj 
     (at [ "title" ] string) 
     (at [ "words" ] (list string)) 


headingFrom : Result String ResObj -> String 
headingFrom result = 
    case result of 
     Ok resobj -> 
      resobj.title 

     Err reason -> 
      toString reason 


main = 
    h1 [] [ text <| headingFrom <| decodeString objDecoder obj ] 

斷裂下來:

  • obj只是表示一些JSON的字符串,以示出的例子中
  • 您可以定義ResObj類型的別名,併爲其獲取類型構造函數。現在您可以通過調用ResObj "MyTitle" ["word1", "wordb", "wordFightingMongooses"]來創建ResObj值。
  • objDecoder是一個幫助將JSON解碼爲ResObj的值。它調用map2,它帶有一個類型構造函數,然後是兩個解碼的JSON字段。 (at ["title"] string)表示「將JSON中的title的值轉換爲一個字符串」,您可以猜測下一行的功能。因此,這最終評估爲ResObj "SomeTitle" ["word1", "word2", "word3", "word4"]並創建您的價值。
  • 在我們的main下,我們有表達式decodeString objDecoder objdecodeString需要一個解碼器值和一個JSON字符串,並查看它是否可以解碼它。但它不返回ResObj本身 - 因爲解碼可能失敗,它會返回一個Result。
  • 所以我們必須用我們的功能headingFrom來處理那個結果。如果解碼成功,我們的結果將是Ok resobj,並且我們可以最終使用resobj。如果失敗,將會是Err reason