Если у вас есть:
object = {"searchresults"=>{"place"=>{"place_id"=>"100066", "osm_type"=>"node", "osm_id"=>"107775", "place_rank"=>"15", "boundingbox"=>"51.3473219,51.6673219,-0.2876474,0.0323526", "lat"=>"51.5073219", "lon"=>"-0.1276474", "display_name"=>"London, Greater London, England, SW1A 2DX, United Kingdom", "class"=>"place", "type"=>"city", "importance"=>"0.9654895765402", "icon"=>"https://locationiq.org/static/images/mapicons/poi_place_city.p.20.png"}, "timestamp"=>"Thu, 25 Apr 19 01:43:32 +0530", "attribution"=>"https://locationiq.com/attribution", "querystring"=>"london", "polygon"=>"false", "exclude_place_ids"=>"100066", "more_url"=>"https://locationiq.org/static/search.php?q=london&exclude_place_ids=100066&format=xml"}}
Возможно, вы захотите использовать:
object.dig('searchresults','place','lat')
=> "51.5073219"
Преимущество состоит в том, что, если случайно, ваш object
не имеет ожидаемогоструктура, вы получите nil
:
object.dig('searchresults','foo_place','lat')
=> nil
В то время как последовательные методы доступа к хешу выдадут ошибку:
object['searchresults']['foo_place']['lat']
Traceback (most recent call last):
1: from (irb):60
NoMethodError (undefined method `[]' for nil:NilClass)
И, вероятно, легче справиться с nil
чем NoMethodError
.
Если вы предпочитаете использовать символы в качестве ключей (вместо строк), то вы можете сделать:
object.with_indifferent_access.dig(:searchresults, :place, :lat)
=> "51.5073219"
Обратите внимание, что без with_indifferent_access
(илиодно из других средств преобразования ваших ключей из строк в символы):
object[:searchresults][:place][:lat]
Traceback (most recent call last):
1: from (irb):67
NoMethodError (undefined method `[]' for nil:NilClass)