Как мне получить доступ к значению из этого хэша? - PullRequest
2 голосов
/ 24 апреля 2019

Я пытаюсь получить доступ к значениям lat и lon в этом хэше, но когда я вызываю @object["lat"] или object[:lat], возвращается nil. Вот хеш:

{"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"}}

Ответы [ 4 ]

4 голосов
/ 24 апреля 2019

Если у вас есть:

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)
1 голос
/ 24 апреля 2019

Если у вас есть этот код, вы можете получить lat и lon следующим образом:

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"}}
lat = object["searchresults"]["place"]["lat"]
lon = object["searchresults"]["place"]["lon"]
1 голос
/ 24 апреля 2019
@object["searchresults"]["place"]["lat"]
0 голосов
/ 25 апреля 2019

Легче увидеть структуру хеша, когда она правильно с отступом. Итак, вот структура хэша, к которому вы хотите получить доступ:

{
  "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"
  }
}

Отсюда вы можете видеть, что клавиша lat фактически находится под путем searchresults -> place -> lat. Следовательно, вы можете достичь его с помощью

@object['searchresults']['place']['lat']

или альтернативно

@object.dig('searchresults', 'place', 'lat')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...