使用Elm解码包含对象的Json数组

18

最近我尝试使用 Elm 的 Http 模块从服务器获取数据,但在将 JSON 解码为自定义类型时遇到了困难。

我的 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)

那么针对前两个属性,我该如何整合嵌套的地址属性并将其与列表解码组合在一起呢?
1个回答

29

你首先需要一个类似于你的 Person Decoder 的地址解码器。

编辑:升级到 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

你如何在 Task.performHttp.get 中使用它?当使用 Http.get 时,我遇到了类型错误,它说它不能与 Decoder (List a) 一起使用,只能与 Decoder a 一起使用。 - user9903
1
@omouse - 没有看到你的代码,我只能猜测(听起来你发送给成功函数的 Msg 中可能存在不匹配的类型参数)- 但如果这不是问题所在,你最好打开一个新的问题或在 Slack 频道中提问。 - Chad Gilbert
@ChadGilbert将其发布为一个问题:http://stackoverflow.com/questions/39628213/task-perform-is-expecting-the-3rd-argument-to-be-a-different-type我没有意识到有一个Slack频道,我一直在使用IRC。 - user9903

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接