Elm 0.18中的JSON解码器

时间:2018-06-28 13:36:47

标签: json elm decoder

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

情况1:

{"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

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

1 个答案:

答案 0 :(得分:1)

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

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