【问题标题】:Decode nested JSON value in Elm (0.18)在 Elm (0.18) 中解码嵌套的 JSON 值
【发布时间】:2017-09-26 00:56:10
【问题描述】:

给定以下类型:

type alias Wrapper =
    { data : Data }

type alias Data =
    { name : String }

还有以下 JSON:

{"data": {"name": "Keith"}}

如何编写一个解码器,让我可以将 HTTP 响应转换为 Wrapper 类型别名的实例?

我使用核心库 Json.Decode.Pipeline 和 Json.Decode.Extra 尝试了多种方法,但没有找到可行的解决方案。

这是我最近的尝试:

dataDecoder =
    succeed Data
        |> andMap (field "name" Decode.string)

wrapperDecoder =
    succeed Wrapper
        |> andMap (field "data" dataDecoder)

结果:

BadPayload "期望一个对象的字段名为 name,但得到的是:{\"data\":{\"name\":\"foo\"}}" { status = { code = 200, message = "OK" }, headers = Dict.fromList [("cache-control","max-age=0, private, must-revalidate"),("content-type","application/json; charset=utf- 8")], url = "http://localhost:5000//users/foo", body = "{\"data\":{\"name\":\"foo\"}}" }

编辑:

这最终成为了最终用户的问题。我正在将正确的解码器传递给Http.post,但Http.send 实际上并没有调用包装Http.post 的函数。呵呵。

【问题讨论】:

  • 很高兴看到你想通了!

标签: json elm


【解决方案1】:

您的解码器对您的示例输入工作正常,但是您收到的错误消息让我相信您正在尝试在 Http 调用中使用 dataDecoder 而不是 wrapperDecoder,因为错误消息正在寻找一个字段命名为name

虽然succeedandMap 可以用于构建您的解码器,但您可以使用map

dataDecoder : Decoder Data
dataDecoder =
    Decode.map Data (field "name" string)

wrapperDecoder : Decoder Wrapper
wrapperDecoder =
    Decode.map Wrapper (field "data" dataDecoder)

【讨论】:

  • 感谢您的回答和香草解决方案。不幸的是,我将wrapperDecoder 传递给Http.post。例如Http.post apiUrl body wrapperDecoder.
  • 有没有办法在没有包装器/包装器解码器的情况下做到这一点,还是我需要额外的包装器类型别名?
【解决方案2】:

正如 Chad Gilbert 所写,您的解码器很好:https://ellie-app.com/kDX99XRbta1/0

要仔细检查,请将类型注释添加到您的解码器:

dataDecoder : Decoder Data
dataDecoder = ...

wrapperDecoder : Decoder Wrapper
wrapperDecoder = ...

如果您真的在使用wrapperDecoder (Http.post apiUrl body wrapperDecoder),则还有一种错误的可能性:您的 API 端点返回的数据具有不同的形状,例如:

{"data": {"data": {"name": "foo"}}}

你能仔细检查一下吗? (在 Chrome 的 Web Inspector 等中)

【讨论】:

  • 感谢您的回答和工作示例!我可以确认我正在将wrapperDecoder 传递给Http.post 并且 我的API 正在以预期的形状返回数据。 curl -X POST http://localhost:5000/users/foo => {"data":{"name":"foo"}}。我将尝试清理我的代码并将其添加到我的问题中以排除任何疑问。
猜你喜欢
  • 2018-12-07
  • 1970-01-01
  • 2020-05-02
  • 2017-01-25
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
  • 2018-07-22
  • 2018-04-10
相关资源
最近更新 更多