【发布时间】: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 |> Decode.map List.head -
您的代码的工作示例位于ellie-app.com/D8WTFxc73Sa1
-
你们是对的,它适用于两种情况,我添加了第三种情况,这是有问题的一种。