JSON Elm 0.18 中的解码器
JSON Decoder in Elm 0.18
在 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
解决方法是将所有数据导入模型,然后从模型中获取信息,但我更愿意避免将不必要的数据添加到我的模型中。我该如何改进?
一种更简化的方法可以使用 Json.Decode.index
强制将索引零处的解码作为字符串(如果存在),否则会失败,因此您可以使用 Json.Decode.maybe
到 return Nothing
失败。
dec0 =
Decode.maybe (Decode.index 0 dec1)
在 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
解决方法是将所有数据导入模型,然后从模型中获取信息,但我更愿意避免将不必要的数据添加到我的模型中。我该如何改进?
一种更简化的方法可以使用 Json.Decode.index
强制将索引零处的解码作为字符串(如果存在),否则会失败,因此您可以使用 Json.Decode.maybe
到 return Nothing
失败。
dec0 =
Decode.maybe (Decode.index 0 dec1)