Разбор 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'
, если вы сами пытаетесь это сделать в консоли.