我向Web API发送有关书籍的JSON请求。我的回复通常看起来像
{
"status": "successful",
"author": "Roald Dahl",
"title": "Charlie and the Chocolate Factory"
}
所以我使用作者和标题字段将其解码为Book
类型。
但有时候,所要求的书籍不会出现在数据库中,所以我的回复只是
{
"status": "failed"
}
在这种情况下,我仍然希望返回Book
类型,但作者和标题设置为“NOT FOUND”。
我正在阅读JSON文档,但我不确定是否有任何有用的东西,或者我是否能以简单的方式在Elm中执行此操作。非常感谢一些建议。
答案 0 :(得分:3)
您可以使用Json.Decode.oneOf
并添加Json.Decode.succeed "NOT FOUND"
作为最后一个选项或者,更好地使用Json.Decode.andThen
,首先解码状态,然后生成Maybe Book
({{1如果状态成功,则Just Book
如果失败)
如果有多种方式失败,您可以使用Nothing
代替Result
。
答案 1 :(得分:1)
您还可以在Evan的Json.Decode.Pipeline使用optional
功能。
然后你可以这样写:
type alias User =
{ id : Int
, name : String
, email : String
}
userDecoder : Decoder User
userDecoder =
decode User
|> required "id" int
|> optional "name" string "blah"
|> required "email" string
如果您需要区分缺失值和null
值,请在文档中提供此示例:
userDecoder2 =
decode User
|> required "id" int
|> optional "name" (oneOf [ string, null "NULL" ]) "MISSING"
|> required "email" string
答案 2 :(得分:0)
在这种情况下,我建议您的作者和标题为Maybe String
类型。在Nothing
的情况下,“未找到”将是显示选择。所以它会是这样的:
type Book =
{ status: String
, author: Maybe String
, title: Maybe String
}
...
loadSuccessDecoder : Json.Decode.Decoder Book
loadSuccessDecoder =
Json.Decode.map3 Book
( Json.Decode.field "status" Json.Decode.String )
( Json.Decode.maybe ( Json.Decode.field "author" Json.Decode.string ) )
( Json.Decode.maybe ( Json.Decode.field "title" Json.Decode.string ) )
我认为其他一切都应该是一个展示选择。