json - 需要创建一个解码器,从父级别的数据中创建一个记录并将其附加到 elm 中的所有子记录

标签 json elm

我有一个这样的json:

{
  "username": "john",
  "email": "john@gmail.com",
  "items": [
     { 
        "id": "id 1"
     },
     { 
        "id": "id 2" 
     }
  ]
}

我需要把它解码成 List Item .项目是这样的记录。
type alias Item =
    { id : String
    , user : User
    }

type alias User =
    { username : String
    , email : String
    }

我想从 json 的顶级提取用户名和电子邮件。然后创建一个 User记录下来,然后将该用户放入每个 Item记录在 List Item .

我知道可以通过使用 Decode.andThen 来完成。 ,但不能让它工作。

对于解码,我使用 json-decode-pipeline .

谢谢

最佳答案

你当然可以用 andThen 做到这一点.这是使用标准 JSON 解码的示例(不需要 json-decode-pipeline)。

首先让我们创建一个用户解码器。这是非常直接的:

userDecoder : Decoder User
userDecoder =
    map2 User
        (field "username" string)
        (field "email" string)

现在,让我们创建一个 Item 解码器,但让我们将其创建为一个函数,该函数接受我们可以放置在 user 上的 User 值。 field 。一分钟后你就会明白为什么:

itemDecoder : User -> Decoder Item
itemDecoder user =
    map2 Item
        (field "id" string)
        (succeed user)

现在我们可以创建顶级项目解码器。您将首先解码用户,然后在构建列表时将其传递给 itemDecoder:

itemsDecoder : Decoder (List Item)
itemsDecoder =
    userDecoder
        |> andThen (\user ->
            field "items" (list (itemDecoder user)))

这可以写得更简洁一点:

itemsDecoder : Decoder (List Item)
itemsDecoder =
    userDecoder
        |> andThen (field "items" << list << itemDecoder)

Here is a working example on ellie-app.com .

关于json - 需要创建一个解码器,从父级别的数据中创建一个记录并将其附加到 elm 中的所有子记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42554479/

相关文章:

sql-server - 使用 SQL : How to extract a record within a JSON object? 解析 JSON

windows-subsystem-for-linux - Elm 安装总是失败,并出现 "ConnectionTimeout"错误(在 WSL 中)

dictionary - Elm:如何合并两个字典?

iteration - 是否可以在 Elm 中迭代联合类型?

javascript - (Angular) 插入一个对象到 json 数组

python - 我可以将 Odoo 浏览对象转换为 JSON

python - Scrapy 解析 JSON 输出

javascript - 如何附加到一个空的 JSON 对象?

elm - 在 Elm 中将整数数组解码为日期

json - Elm:解析嵌套的 json