2013-08-19 30 views
10

Trong điều khiển của tôi, tôi có đoạn mã sau ...Parsing JSON trong điều khiển w/HTTParty

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

Tôi nhận được một NoMethodError/không xác định phương pháp 'id'

Nếu tôi làm ...

logger.debug(response.body) 

nó ra như nó phải ...

{"id":"4","name":"Mark Zuckerberg","first_name":"Mark","last_name":"Zuckerberg","link":"http:\/\/www.facebook.com\/zuck","username":"zuck","gender":"male","locale":"en_US"} 

Một người sẽ nghĩ rằng đó là response.body.id, nhưng rõ ràng là không hoạt động. Cảm ơn trước!

Trả lời

27

Hãy thử điều này:

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

Đối với loại điều, tôi khuyên bạn nên hoặc là một) sử dụng Koala hoặc b) tạo ra một lớp sử dụng httparty. Sau đó, bạn có thể đặt format: json để tự động phân tích cú pháp json đã trả về. Xem herehere

+1

Để giải thích một chút về câu trả lời này: bạn không thể xử lý đơn giản phản hồi của 'HTTParty.get' giống như mô hình ActiveRecord. Thật không may, bạn sẽ chỉ nhận được một băm trở lại và không phải là một mô hình. –

+0

Christoph là chính xác :) – Niall

+0

Tuyệt vời! Điều này làm việc. Cảm ơn các bạn đã giúp đỡ. – gbdev

0

HTTParty sẽ tự động phân tích cú pháp nội dung dựa trên loại nội dung được trả lại. Một cái gì đó có vẻ như đang xảy ra với json's 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\"}" 

Nhưng công trình này OK:

pry(main)> HTTParty.get('http://echo.jsontest.com/foo/bar/baz/foo') 
=> {"baz"=>"foo", "foo"=>"bar"} 

Đừng quên require 'httparty' nếu bạn đang cố gắng rằng trong giao diện điều khiển chính mình.

10

Bạn có thể buộc các phản ứng được đối xử như JSON sử dụng HTTParty.get như vậy:

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

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

=> "Let It Happen" 
+0

Cảm ơn thông báo 'định dạng', từ mã tôi nghĩ đó là' trình phân tích cú pháp'. –

5

Bạn có thể sử dụng response['id'] trong trường hợp đó phản ứng Content-Typeapplication/json hoặc cũng response.parse_response để có được một Hash được tạo ra từ payload JSON .

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

payload = response.parsed_response 

logger.debug(payload['id']) 
+0

Điều này có vẻ tốt hơn câu trả lời được chấp nhận! – Antzi

Các vấn đề liên quan