2016-09-04 5 views
6

最近ElmのHttpモジュールを使ってサーバーからデータを取得しようとしましたが、Elmのカスタムタイプにjsonをデコードすることができません。Elmのオブジェクトを使ったJson Arrayのデコード

私のJSONは以下のようになります。

にデコードする必要があります
[{ 
    "id": 1, 
    "name": "John", 
    "address": { 
     "city": "London", 
     "street": "A Street", 
     "id": 1 
    } 
}, 
{ 
    "id": 2, 
    "name": "Bob", 
    "address": { 
     "city": "New York", 
     "street": "Another Street", 
     "id": 1 
    } 
}] 

:何私がこれまでに見つかったことは、私はデコーダ機能を記述する必要があるということです

type alias Person = 
{ 
id : Int, 
name: String, 
address: Address 
} 

type alias Address = 
{ 
id: Int, 
city: String, 
street: String 
} 

personDecoder: Decoder Person 
personDecoder = 
    object2 Person 
    ("id" := int) 
    ("name" := string) 

これは、最初の2つのプロパティに対して、どのように入れ子になったAddressプロパティを統合するのか、これを組み合わせてtをデコードする方法です彼はリスト?

答えて

14

あなたが最初にあなたの個人デコーダ

編集に似たアドレスデコーダが必要です。エルム0.18

import Json.Decode as JD exposing (field, Decoder) 

addressDecoder : Decoder Address 
addressDecoder = 
    JD.map3 Address 
    (field "id" int) 
    (field "city" string) 
    (field "street" string) 

にアップグレードその後、あなたは「アドレス」フィールドのためにそれを使用することができます。

personDecoder: Decoder Person 
personDecoder = 
    JD.map3 Person 
    (field "id" int) 
    (field "name" string) 
    (field "address" addressDecoder) 

人のリストは次のようにデコードできます:

personListDecoder : Decoder (List Person) 
personListDecoder = 
    JD.list personDecoder 
+0

ありがとう、ありがとうございますが、どうすればPersonのリストをデコードすることができますか? – rubiktubik

+1

リスト・デコーダを含むように答えを更新しました –

+0

ありがとうございました!非常に素晴らしい解決策! – rubiktubik

関連する問題