web-dev-qa-db-ja.com

ElmのオブジェクトでJson配列をデコードします

最近、ElmのHttpモジュールを使用してサーバーからデータを取得しようとしましたが、JSONをElmのカスタムタイプにデコードするのに行き詰まっています。

私の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プロパティを統合する方法と、これを組み合わせてリストをデコードする方法を教えてください。

18
rubiktubik

まず、PersonDecoderと同様のAddressDecoderが必要です

編集:Elm 0.18にアップグレード

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

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
26
Chad Gilbert