【问题标题】:JSON Decoder in Elm 0.18Elm 0.18 中的 JSON 解码器
【发布时间】:2018-12-07 14:57:19
【问题描述】:

在 Elm 0.18 中,我想为以下示例构建 JSON 解码器:

案例一:

{"metadata": {"signatures":[{"metadata": {"code": "1234"}},
                            {"metadata": {"code": "5678"}}]}}  

-> { code = Just "1234" }

案例2:

{"metadata": {"signatures":[]}} 

-> { code = Nothing }

案例3:

{"metadata": {"signatures":[{"metadata": null}]}} 

-> { code = Nothing }

这是我的工作,但在案例 3 中失败了。

type alias Code = { code : Maybe String }

let
    js = """{"metadata": {"signatures":[{"metadata": {"code": "1234"}},
                   {"metadata": {"code": "5678"}}]}}"""

    dec1 =
        Decode.at [ "metadata", "code" ] Decode.string

    dec0 =
        Decode.list dec1
            |> Decode.andThen
                (\v ->
                    if List.isEmpty v then
                        Decode.succeed Nothing
                    else
                        Decode.succeed <| List.head v
                )

    dec =
        decode Code
            |> optionalAt [ "metadata", "signatures" ] dec0 Nothing

    expected =
        Ok { code = Just "1234" }
in
    Decode.decodeString dec js
        |> Expect.equal expected

一种解决方法是将所有数据导入模型,然后从模型中获取信息,但我更愿意避免将不必要的数据添加到我的模型中。我该如何改进?

【问题讨论】:

  • 第二个字符串的输出是什么?我运行了你的代码,第二个字符串得到Ok { code = Nothing }。
  • 你的解码器works for me。注意dec0可以简写为Decode.list dec1 |&gt; Decode.map List.head
  • 您的代码的工作示例位于ellie-app.com/D8WTFxc73Sa1
  • 你们是对的,它适用于两种情况,我添加了第三种情况,这是有问题的一种。

标签: json elm decoder


【解决方案1】:

更简化的方法可以使用Json.Decode.index 强制在索引零处解码为字符串(如果存在),否则会失败,因此您可以使用Json.Decode.maybe 在失败时返回Nothing。

dec0 =
    Decode.maybe (Decode.index 0 dec1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 2017-01-12
    相关资源
    最近更新 更多