Подтвердить что ты не робот

Анализ ответа 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"}, 
4b9b3361

Ответ 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.