elm0.18中的JSON解码器

elm0.18中的JSON解码器,json,elm,decoder,Json,Elm,Decoder,在Elm 0.18中,我想为以下示例构建一个JSON解码器: 案例1: {"metadata": {"signatures":[{"metadata": {"code": "1234"}}, {"metadata": {"code": "5678"}}]}} -> { code = Just "1234" } 案例2: {"metadata": {"signatures":[]}} -> { code = Nothi

在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
type alias code={code:Maybe String}
让
js=“”{“元数据”:{“签名”:[{“元数据”:{“代码”:“1234”},
{“元数据”:{“代码”:“5678”}}]}
十二月一日=
Decode.at[“元数据”,“代码”]Decode.string
十二月=
Decode.list dec1
|>解码。然后
(\v->
如果List.i是空的,那么
没有成功
其他的
Decode.success选项位于[“元数据”,“签名”]dec0无任何内容
期望=
好{code=Just“1234”}
在里面
Decode.decodeString dec js
|>期待

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

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

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

第二个字符串的输出是什么?我运行了你的代码,得到了
Ok{code=Nothing}
用于第二个字符串。您的解码器。请注意,
dec0
可以缩短为
Decode.list dec1 |>Decode.map list。head
您的代码的工作示例是在你们是对的,它适用于两种情况,我添加了第三个,这是有问题的一个。