我正在尝试将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有一些暗示要映射到结构但不能嵌套数据。
是否有一个示例或常见做法来解码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
}
答案 0 :(得分: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
必须使用Enumertion来删除匿名结构,并且字段名称的重新映射未显示为本机解决方案。尽管如此,还是一条前进的道路。