在控制器中使用HTTParty解析JSON

17

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

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

我遇到了一个NoMethodError / undefined method 'id'(未定义方法'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,但显然这不起作用。提前感谢!

4个回答

37

试试这个:

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

对于这种情况,我建议要么使用Koala,要么使用httparty创建一个类。然后可以设置format: json来自动解析返回的json。参见这里这里


1
稍微解释一下这个答案:你不能简单地将HTTParty.get的响应视为ActiveRecord模型。不幸的是,你只会得到一个哈希值而不是模型。 - Christoph Eicke
看起来当前版本的HTTParty将来自Facebook的响应解释为JSON,而无需进行任何额外的强制转换。 - bonh

13

你可以使用HTTParty.get来强制将响应视为JSON,像这样:

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

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

=> "Let It Happen"

感谢注意到 format,从代码中我以为它是 parser - Dmitry Polushkin

10

如果响应的 Content-Typeapplication/json ,你可以使用 response['id'] 或者 response.parse_response 来获取JSON负载生成的哈希值。

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

payload = response.parsed_response

logger.debug(payload['id'])

注意: parsed_response 是一个哈希表(Hash),只有当响应的 Content-Typeapplication/json 时才会返回,否则 HTTParty 将以字符串形式返回。如果需要强制转换为 Hash,请在响应未返回 application/json 的情况下传递 format 参数:HTTParty.get(url, format: :json)


请注意,您可能需要执行 HTTParty.get('https://graph.facebook.com/zuck', format: :json) - 否则 parsed_response 可能是原始的 JSON 字符串而不是 Ruby 哈希。 - Henrik N
如果响应的内容类型是 application/json,我就不需要 format: :json - Pablo Cantero
@HenrikN 我添加了一条注释以澄清它 :) - Pablo Cantero

0

HTTParty 应该根据返回的内容类型自动解析内容。看起来 zuck 的 JSON 有些问题。

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'


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接