2013-08-19 41 views
10

在我的控制,我有以下代碼...JSON解析控制器中的W/HTTParty

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

我得到一個NoMethodError /未定義的方法'身份證」

如果我做...

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,但顯然這是行不通的。提前致謝!

回答

27

試試這個:

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

對於這種事情,我建議或者使用Koala a)或b)使用httparty創建一個類。然後,您可以設置format: json自動分析返回的json。請參閱herehere

+1

要詳細解釋一下這個答案:你不能簡單地將你的'HTTParty.get'的響應看作是一個ActiveRecord模型。不幸的是,你只會得到一個散列,而不是一個模型。 –

+0

克里斯托弗是正確的:) – Niall

+0

太棒了!這工作。謝謝你們的幫助。 – gbdev

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'

10

您可以強制響應被視爲JSON使用HTTParty.get像這樣:

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

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

=> "Let It Happen" 
+0

感謝注意'格式',從代碼中我認爲它是'解析器'。 –

5

您可以使用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']) 
+0

這看起來比接受的答案好! – Antzi