我可以在JSON解码器中使用默认值吗?

时间:2016-12-03 02:17:44

标签: elm

我向Web API发送有关书籍的JSON请求。我的回复通常看起来像

{
    "status": "successful",
    "author": "Roald Dahl",
    "title": "Charlie and the Chocolate Factory"
}

所以我使用作者和标题字段将其解码为Book类型。

但有时候,所要求的书籍不会出现在数据库中,所以我的回复只是

{
    "status": "failed"
}

在这种情况下,我仍然希望返回Book类型,但作者和标题设置为“NOT FOUND”。

我正在阅读JSON文档,但我不确定是否有任何有用的东西,或者我是否能以简单的方式在Elm中执行此操作。非常感谢一些建议。

3 个答案:

答案 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 ) )

我认为其他一切都应该是一个展示选择。