Анализ ответа HTTParty
Я использую HTTParty, чтобы вытащить список книг пользователя Facebook, но у меня возникли проблемы с анализом ответа:
Facebook возвращает данные таким образом:
{
"data": [
{
"name": "Title",
"category": "Book",
"id": "21192118877902",
"created_time": "2011-11-11T20:50:47+0000"
},
{
"name": "Title 2",
"category": "Book",
"id": "1886126860176",
"created_time": "2011-11-05T02:35:56+0000"
},
И HTTParty анализирует это на объект ruby. Я пробовал что-то вроде этого (где ret
- ответ) ret.parsed_response
, и он возвращает массив данных, но на самом деле доступ к элементам внутри возвращает метод, который не обнаружил ошибку.
Это пример того, что HTTPARTy фактически возвращает:
#<HTTParty::Response:0x7fd0d378c188 @parsed_response={"data"=>[{"name"=>"Title", "category"=>"Book", "id"=>"21192111877902", "created_time"=>"2011-11-11T20:50:47+0000"}, {"name"=>"Title 2", "category"=>"Book", "id"=>"1886126860176", "created_time"=>"2011-11-05T02:35:56+0000"}, {"name"=>"Thought Patterns", "category"=>"Book", "id"=>"109129539157186", "created_time"=>"2011-10-27T00:00:16+0000"},
Ответы
Ответ 1
Есть ли у вас код, который вызывает ошибку? Переменная parsed_response
из ответа HTTParty является хешем, а не массивом. Он содержит один ключ, "data"
(строка, НЕ символ). Значение для ключа "data"
в хеш-массиве - это хеш-массив, поэтому вы должны выполнять следующие действия:
data = ret.parsed_response["data"]
data.each do |item|
puts item["name"]
puts item["category"]
puts item["id"]
# etc
end
Ответ 2
Просто дополнительная информация - Не всегда ответ JSON по умолчанию
HTTParty result.response.body
или result.response.parsed_response
имеет не форму Hash
Это зависит в основном от заголовков, которые вы используете в своем запросе. Для примера вам нужно указать заголовок Accept
с application/json
значением, нажав API GitHub, в противном случае он просто возвращается как строка.
Тогда вам придется использовать JSON.parse(data)
для того же самого, чтобы преобразовать ответ строки в объект Hash.