Разбор JSON в контроллере с HTTParty

В моем контроллере у меня есть следующий код...

response = HTTParty.get('https://graph.facebook.com/zuck')
logger.debug(response.body.id)

Я получаю метод NoMethodError/ undefined `id '

Если я...

logger.debug(response.body)

Он выводится как следует...

{"id":"4","name":"Mark Zuckerberg","first_name":"Mark","last_name":"Zuckerberg","link":"http:\/\/www.facebook.com\/zuck","username":"zuck","gender":"male","locale":"en_US"}

Можно было бы подумать, что это response.body.id, но очевидно, что это не работает. Спасибо заранее!

Ответ 1

Попробуйте следующее:

body = JSON.parse(response.body)
id = body["id"]

Для такого рода вещей я бы рекомендовал либо a) использовать Koala, либо b) создать класс, используя httparty. Затем вы можете установить format: json для автоматического анализа возвращенного json. См. здесь и здесь

Ответ 2

Вы можете заставить ответ обрабатываться как JSON с помощью HTTParty.get следующим образом:

response = HTTParty.get("http://itunes.apple.com/search",
    {query: {term: 'tame impala'}, format: :json})

response['results'][0]['trackName']

=> "Let It Happen"

Ответ 3

Вы можете использовать response['id'], если ответ Content-Type равен application/json или также response.parse_response, чтобы получить хэш, сгенерированный из полезной нагрузки JSON.

response = HTTParty.get('https://graph.facebook.com/zuck')

payload = response.parsed_response

logger.debug(payload['id'])

Ответ 4

HTTParty должен автоматически анализировать содержимое на основе возвращаемого типа содержимого. Кажется, что-то рыбное происходит с дзек-джсоном.

pry(main)> HTTParty.get('https://graph.facebook.com/zuck')
=> "{\"id\":\"4\",\"first_name\":\"Mark\",\"gender\":\"male\",\"last_name\":\"Zuckerberg\",\"link\":\"https:\\/\\/www.facebook.com\\/zuck\",\"locale\":\"en_US\",\"name\":\"Mark Zuckerberg\",\"username\":\"zuck\"}"

Но это работает нормально:

pry(main)> HTTParty.get('http://echo.jsontest.com/foo/bar/baz/foo')
=> {"baz"=>"foo", "foo"=>"bar"}

Не забудьте require 'httparty', если вы сами пытаетесь это сделать в консоли.