【发布时间】: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.