【问题标题】:Parsing JSON in Controller w/ HTTParty使用 HTTParty 在控制器中解析 JSON
【发布时间】:2013-08-19 18:32:17
【问题描述】:

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

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

我得到一个 NoMethodError / 未定义的方法 `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,但显然这不起作用。提前致谢!

【问题讨论】:

    标签: ruby-on-rails ruby facebook-graph-api httparty


    【解决方案1】:

    试试这个:

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

    对于这种事情,我建议 a) 使用 Koala 或 b) 使用 httparty 创建一个类。然后你可以设置format: json 来自动解析返回的json。见herehere

    【讨论】:

    • 详细说明一下这个答案:您不能简单地将HTTParty.get 的响应视为 ActiveRecord 模型。不幸的是,你只会得到一个哈希值而不是一个模型。
    • 当前版本的 HTTParty 似乎将来自 Facebook 的响应解释为 JSON,而无需进行任何额外的强制。
    【解决方案2】:

    您可以使用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
    【解决方案3】:

    如果响应Content-Typeapplication/jsonresponse.parse_response,您可以使用response['id'] 来获取从JSON 有效负载生成的哈希。

    response = HTTParty.get('https://graph.facebook.com/zuck')
    
    payload = response.parsed_response
    
    logger.debug(payload['id'])
    

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

    【讨论】:

    • 请注意,您可能需要执行 HTTParty.get('https://graph.facebook.com/zuck', format: :json) - 否则 parsed_response 可能是原始 JSON 字符串而不是 Ruby 哈希。
    • @HenrikN 如果响应内容类型是application/json,我不需要format: :json
    • @HenrikN 我添加了一个注释来澄清它:)
    【解决方案4】:

    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'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-11
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      • 1970-01-01
      • 2013-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多