Извлечение значения из сложного хэша в Ruby

Я использую API (Zillow), который возвращает сложный хэш. Пример результата

{"xmlns:xsi"=>"http://www.w3.org/2001/XMLSchema-instance", 
 "xsi:schemaLocation"=>"http://www.zillow.com/static/xsd/SearchResults.xsd http://www.zillowstatic.com/vstatic/5985ee4/static/xsd/SearchResults.xsd", 
 "xmlns:SearchResults"=>"http://www.zillow.com/static/xsd/SearchResults.xsd", "request"=>[{"address"=>["305 Vinton St"], "citystatezip"=>["Melrose, MA 02176"]}],
 "message"=>[{"text"=>["Request successfully processed"], "code"=>["0"]}],
 "response"=>[{"results"=>[{"result"=>[{"zpid"=>["56291382"], "links"=>[{"homedetails"=>["http://www.zillow.com/homedetails/305-Vinton-St-Melrose-MA-02176/56291382_zpid/"], 
 "graphsanddata"=>["http://www.zillow.com/homedetails/305-Vinton-St-Melrose-MA-02176/56291382_zpid/#charts-and-data"], "mapthishome"=>["http://www.zillow.com/homes/56291382_zpid/"], 
 "comparables"=>["http://www.zillow.com/homes/comps/56291382_zpid/"]}], "address"=>[{"street"=>["305 Vinton St"], "zipcode"=>["02176"], "city"=>["Melrose"], "state"=>["MA"], "latitude"=>["42.466805"], 
 "longitude"=>["-71.072515"]}], "zestimate"=>[{"amount"=>[{"currency"=>"USD", "content"=>"562170"}], "last-updated"=>["06/01/2014"], "oneWeekChange"=>[{"deprecated"=>"true"}], "valueChange"=>[{"duration"=>"30", "currency"=>"USD", "content"=>"42749"}], "valuationRange"=>[{"low"=>[{"currency"=>"USD", 
 "content"=>"534062"}], "high"=>[{"currency"=>"USD", "content"=>"590278"}]}], "percentile"=>["0"]}], "localRealEstate"=>[{"region"=>[{"id"=>"23017", "type"=>"city", 
 "name"=>"Melrose", "links"=>[{"overview"=>["http://www.zillow.com/local-info/MA-Melrose/r_23017/"], "forSaleByOwner"=>["http://www.zillow.com/melrose-ma/fsbo/"],
 "forSale"=>["http://www.zillow.com/melrose-ma/"]}]}]}]}]}]}]}

Я могу извлечь конкретное значение, используя следующее:

result = result.to_hash

p result["response"][0]["results"][0]["result"][0]["zestimate"][0]["amount"][0]["content"]

Кажется странным указывать таким образом индекс каждого элемента. Есть ли более простой способ получить именованное значение?

2 ответа

Похоже, это должно быть проанализировано в XML. Согласно документации Zillow API, он возвращает XML по умолчанию. Очевидно, to_hash смог превратить это в хеш (хотя и очень уродливый), но вы действительно пытаетесь переплыть вверх по течению, используя его таким образом. Я бы порекомендовал использовать его по назначению (xml) в начале, а затем, возможно, позже проанализировать его в более простой для использования формат (например, структуру JSON/Hash).

Nokogiri ОТЛИЧНО разбирает XML! Вы можете использовать синтаксис xpath для извлечения элементов из dom или даже css-селекторов.

Например, чтобы получить массив "содержимого" в каждом результате:

response = #get xml response from zillow
results = Nokogiri::XML(response).remove_namespaces!
#using css
content_array = results.css("result content")
#same thing using xpath:
content_array = results.xpath("//result//content")

Если вы просто хотите получить контент из первого результата, вы можете сделать это как ярлык:

content = results.at_css("result content").content

Поскольку это действительно XML-дамп в JSON, вы можете использовать JSONPath для запроса JSON

Другие вопросы по тегам