Предположим, у вас есть строка JSON, которая выглядит, например, следующим образом:
"[{\"place_id\":\"100066\",\"lat\":\"51.5073219\",\"lon\":\"-0.1276474\",\"class\":\"place\",\"type\":\"city\"}]"
Тогда вы сможете сделать (грубо говоря):
JSON.dump(
JSON.
parse(
"[{\"place_id\":\"100066\",\"lat\":\"51.5073219\",\"lon\":\"-0.1276474\",\"class\":\"place\",\"type\":\"city\"}]"
).
first.
slice('lat', 'lon')
)
Это должно дать вам:
=> "{\"lat\":\"51.5073219\",\"lon\":\"-0.1276474\"}"
Теперь я напомню, что HTTParty может уже преобразовать ответ API в объект Ruby (массив или хэш), так что JSON.dump
может не понадобиться.И, возможно, вам понадобятся другие скрипты (например, вы можете использовать with_indifferent_access
, если вы предпочитаете работать с символами в качестве ключей вместо строк).
Просто чтобы было понятно, если вы хотите, чтобы этобыть частью вашего метода класса, тогда вы можете сделать что-то вроде:
class LocationiqApi
include HTTParty
BASE_URI = "https://eu1.locationiq.com/v1/search.php"
attr_accessor :city
def initialize(api_key, format = "json")
@options = { key: api_key, format: format }
end
def find_coordinates(city)
JSON.dump(
JSON.
parse(
self.class.get(BASE_URI, query: @options.merge({ q: city }))
).
first.
slice('lat', 'lon')
)
end
def handle_error
if find_coordinates.code.to_i = 200
find_coordinates.parsed_response
else
raise "Couldn't connect to LocationIQ Api"
end
end
end
Если self.class.get(BASE_URI, query: @options.merge({ q: city }))
возвращает что-либо кроме допустимой строки JSON
, которая представляет array
из hashes
, то этовероятно потерпит неудачу.
Я полагаю, что ключевые биты:
- Вам необходимо преобразовать (проанализировать) ваш JSON во что-то, с чем может работать Ruby;
- После анализа вам нужнополучить
hash
из ваших array
хешей (при условии, что массив хешей всегда является результатом синтаксического анализа); - Вы можете использовать
slice
, чтобы использовать только те пары ключ-значение, которые вы хотите; - Затем, поскольку вы указали, что хотите вернуть JSON, вам необходимо превратить ваш объект Ruby обратно в JSON, используя, например,
JSON.dump
.Вы также можете использовать, я полагаю, to_json
.В зависимости от того, что плывет на вашей лодке.