我正在尝试使用Elixir中的Google Maps地理编码API,虽然我对该语言有点新手,因此使用嵌套数据结构让我望而却步。
我正在使用HTTPotion从地理编码端点获取JSON,并使用JSEX将其解析为Elixir数据结构(一系列嵌套列表和元组)。
defmodule Geocode do
def fetch do
HTTPotion.start
result = HTTPotion.get "http://maps.googleapis.com/maps/api/geocode/json?address=Fairfax,%20Vermont&sensor=false"
json = JSEX.decode result.body
end
end
以下内容现已分配给json。
{:ok, [{"results", [[{"address_components", [[{"long_name", "Fairfax"}, {"short_name", "Fairfax"}, {"types", ["locality", "political"]}], [{"long_name", "Franklin"}, {"short_name", "Franklin"}, {"types", ["administrative_area_level_2", "political"]}], [{"long_name", "Vermont"}, {"short_name", "VT"}, {"types", ["administrative_area_level_1", "political"]}], [{"long_name", "United States"}, {"short_name", "US"}, {"types", ["country", "political"]}]]}, {"formatted_address", "Fairfax, VT, USA"}, {"geometry", [{"bounds", [{"northeast", [{"lat", 44.772892}, {"lng", -72.92268890000001}]}, {"southwest", [{"lat", 44.6330508}, {"lng", -73.08477409999999}]}]}, {"location", [{"lat", 44.6654963}, {"lng", -73.01032}]}, {"location_type", "APPROXIMATE"}, {"viewport", [{"northeast", [{"lat", 44.772892}, {"lng", -72.92268890000001}]}, {"southwest", [{"lat", 44.6330508}, {"lng", -73.08477409999999}]}]}]}, {"types", ["locality", "political"]}]]}, {"status", "OK"}]}
我想从这个嵌套的数据结构中提取纬度和经度。我尝试过使用模式匹配,但由于结构相当复杂,相应的模式有点像噩梦。虽然以下工作可能不是一个好的解决方案。
{_, [{_, [[_, _, { _, [{_, [{_, [{_, lat}, {_, lgn}]}, _]}, _, _, _] }, _]]}, _]} = json
所以我的问题是从Elixir中深层嵌套的数据结构中提取值的最佳方法是什么?任何正确方向的解决方案或推动都将不胜感激。
答案 0 :(得分:8)
答案 1 :(得分:4)
ej库看起来是个不错的选择,但另外我可能会立即切入数据结构的核心:
{:ok, [{"results", results}, {"status", status}]} = JSEX.decode result.body
或者如果您始终只使用第一个结果:
{:ok, [{"results", [geo_json | _]}, {"status", status}]} = JSEX.decode result.body
然后我会在geo_json数据结构上使用ej库。