我有一个像这样的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。
由于
答案 0 :(得分:5)
您当然可以使用andThen
执行此操作。以下是使用标准JSON解码的示例(不需要json-decode-pipeline)。
首先,让我们创建一个用户解码器。这很简单:
userDecoder : Decoder User
userDecoder =
map2 User
(field "username" string)
(field "email" string)
现在,让我们创建一个Item解码器,但是让它创建一个接受我们可以放在user
字段上的User值的函数。你会在一分钟内看到原因:
itemDecoder : User -> Decoder Item
itemDecoder user =
map2 Item
(field "id" string)
(succeed user)
现在我们可以创建顶级的Items解码器。您首先解码用户,然后在构建列表时将其传递给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)