我有一个这样的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/