我有一个这样的json:
{
"username": "john",
"email": "john@gmail.com",
"items": [
{
"id": "id 1"
},
{
"id": "id 2"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我需要解码它List Item.物品是这样的记录.
type alias Item =
{ id : String
, user : User
}
type alias User =
{ username : String
, email : String
}
Run Code Online (Sandbox Code Playgroud)
我想从顶级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)
Run Code Online (Sandbox Code Playgroud)
现在,让我们创建一个Item解码器,但是我们将它创建为一个接受我们可以放置到user字段上的User值的函数.你会在一分钟内看到原因:
itemDecoder : User -> Decoder Item
itemDecoder user =
map2 Item
(field "id" string)
(succeed user)
Run Code Online (Sandbox Code Playgroud)
现在我们可以创建顶级Items解码器.您将首先解码用户,然后在构建列表时将其传递给itemDecoder:
itemsDecoder : Decoder (List Item)
itemsDecoder =
userDecoder
|> andThen (\user ->
field "items" (list (itemDecoder user)))
Run Code Online (Sandbox Code Playgroud)
这可以写得更简洁一点:
itemsDecoder : Decoder (List Item)
itemsDecoder =
userDecoder
|> andThen (field "items" << list << itemDecoder)
Run Code Online (Sandbox Code Playgroud)