使用HTTParty解析Controller中的JSON

gbd*_*dev 15 ruby ruby-on-rails httparty facebook-graph-api

在我的控制器中,我有以下代码......

response = HTTParty.get('https://graph.facebook.com/zuck')
logger.debug(response.body.id)
Run Code Online (Sandbox Code Playgroud)

我得到一个NoMethodError/undefined方法`id'

如果我做...

logger.debug(response.body)
Run Code Online (Sandbox Code Playgroud)

它按原样输出......

{"id":"4","name":"Mark Zuckerberg","first_name":"Mark","last_name":"Zuckerberg","link":"http:\/\/www.facebook.com\/zuck","username":"zuck","gender":"male","locale":"en_US"}
Run Code Online (Sandbox Code Playgroud)

人们会认为这是response.body.id,但显然这不起作用.提前致谢!

Nia*_*son 35

试试这个:

body = JSON.parse(response.body)
id = body["id"]
Run Code Online (Sandbox Code Playgroud)

对于这种事情,我建议使用a)使用Koala或b)使用httparty创建一个类.然后,您可以设置format: json为自动解析返回的json.看到这里这里


bon*_*onh 12

您可以强制将响应视为JSON,HTTParty.get如下所示:

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

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

=> "Let It Happen"
Run Code Online (Sandbox Code Playgroud)


Pab*_*ero 7

如果response['id']响应Content-Typeapplication/json或者也是response.parse_response为了获得从JSON有效负载生成的哈希,您可以使用.

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

payload = response.parsed_response

logger.debug(payload['id'])
Run Code Online (Sandbox Code Playgroud)

注:parsed_response是一个Hash,只有在响应Content-Typeapplication/json,否则HTTParty将返回它作为一个字符串.为了强制执行哈希,如果响应未返回application/json,您可以将其format作为参数传递HTTParty.get(url, format: :json).