将嵌套的JSON有效内容映射到Elixir中的结构

Bil*_*ian 6 json elixir

我试图将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
Run Code Online (Sandbox Code Playgroud)

我的困难是将JSON主体解析为适当的结构,其中JSON包含嵌套数据.Jazz有一些暗示要映射到结构但不能嵌套数据.

是否有一个示例或常见的做法来解码Elixir中的JSON,类似于Go的用法:

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
}
Run Code Online (Sandbox Code Playgroud)

Bil*_*ian 5

使用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
Run Code Online (Sandbox Code Playgroud)

必须使用Enumertion来删除匿名结构,并且字段名称的重新映射未显示为本机解决方案.尽管如此,还是一条前进的道路.