【问题标题】:Map a nested JSON payload to a struct in Elixir将嵌套的 JSON 有效负载映射到 Elixir 中的结构
【发布时间】:2017-01-12 13:35:48
【问题描述】:

我正在尝试将 Golang 教程 geddit 移植到 Elixir。我用 Dartlang 成功地做到了这一点,但是 Elixir 在地图和列表上的操作让我感到困惑。

使用 HTTPoison 和 JSEX,我有以下代码:

defmodule Redditex do
  use HTTPoison.Base

  def process_url(url) do
    "http://www.reddit.com/r/#{url}.json"
  end

  def process_response_body(body) do
    json = JSEX.decode! body
    json = Enum.map json, fn ({k, v}) -> {String.to_atom(k), v } end
    json
  end
end

我的困难是将 JSON 正文解析为 JSON 包含嵌套数据的适当结构。 Jazz 暗示了映射到结构,但没有嵌套数据。

是否有类似 Go 的用法在 Elixir 中解码 JSON 的示例或常见做法:

type Response struct {
Data struct {
    Children []struct {
        Data Item
    }
  }
}

type Item struct {
   Title    string
   URL      string
   Comments int `json:"num_comments"`  #mapping to another field label
}

【问题讨论】:

  • 也许最好的方法是解码 JSON,然后,当你想和孩子们一起工作时,struct(Item, item_map_from_json)?
  • 我自己现在也在努力采用这种方法。新手问题。但是,我正在寻找一个库或内置支持来构建基于预期 JSON 响应的结构。你在项目级别说的有点像,我对如何做感到困惑,但是在嵌套结构的主体级别。
  • 好吧,我的想法是,如果你只需要孩子,你可以这样做:response["children"] |> convert_items_to_struct()。但是,如果您需要保留整个结构,您可以使用update_in/2 遍历到已知的嵌套级别并对其进行更新。例如update_in response["children"], &convert_items_to_struct/1.

标签: json elixir


【解决方案1】:

使用 Poison JSON 库,我能够部分处理嵌套:

def handle_response(%{status_code: 200, body: body}) do
    json = Poison.decode!(body, as: %{"data" => %{"children" => [%{"data" => Redditex.Item}]}})
    items = Enum.map( json["data"]["children"], fn (x) -> x["data"] end )
end

枚举是删除匿名结构所必需的,并且字段名称的重新映射尚未显示为本机解决方案。一条前进的工作道路。

【讨论】:

    猜你喜欢
    • 2023-01-11
    • 2017-01-04
    • 2021-07-06
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多