web-dev-qa-db-ja.com

HTTPartyを使用したコントローラーでのJSONの解析

私のコントローラーには次のコードがあります...

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

NoMethodError/undefined method `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だと思うかもしれませんが、明らかに機能していません。前もって感謝します!

15
gbdev

これを試して:

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

この種のことについては、a) Koala を使用するか、b)httpartyを使用してクラスを作成することをお勧めします。次に、format: json返されたjsonを自動解析します。 here および here を参照してください

35
Niall Paterson

次のようにHTTParty.getを使用して、応答を強制的にJSONとして扱うことができます。

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

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

=> "Let It Happen"
12
bonh

応答_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'])
_

注:_parsed_response_がハッシュであるのは、応答_Content-Type_が_application/json_の場合のみです。それ以外の場合、HTTPartyは文字列として返します。ハッシュを適用する場合、レスポンスが_application/json_を返さない場合、formatをパラメータHTTParty.get(url, format: :json)として渡すことができます。

7
Pablo Cantero

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'を忘れないでください。

0
Rimian