在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
一种解决方法是将所有数据导入模型,然后从模型中获取信息,但我宁愿避免在模型中添加不必要的数据。我该如何改善呢?
答案 0 :(得分:1)
一种更简化的方法可以使用Json.Decode.index
强制将索引零作为字符串解码(如果存在的话),否则将失败,因此可以使用Json.Decode.maybe
返回Nothing
。失败。
dec0 =
Decode.maybe (Decode.index 0 dec1)