2013-08-19 6 views
10

In meinem Controller ich den folgenden Code haben ...Parsing JSON in-Controller w/HTTParty

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

Ich erhalte eine NoMethodError/nicht definierte Methode `id‘

Wenn ich das tue ...

logger.debug(response.body) 

es gibt, wie es sollte ...

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

Man würde denken, es ist response.body.id, aber offensichtlich funktioniert das nicht. Danke im Voraus!

Antwort

27

Versuchen Sie folgendes:

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

Für diese Art der Sache, würde ich empfehlen, entweder a) mit Koala oder b) erstellen Sie eine Klasse httparty verwenden. Sie können dann format: json festlegen, um den zurückgegebenen JSON automatisch zu analysieren. Siehe here und here

+1

Um ein wenig auf diese Antwort zu erarbeiten: Sie können nicht einfach die Antwort Ihres 'HTTParty.get' behandeln, als wäre es ein ActiveRecord-Modell. Leider erhalten Sie nur einen Hash zurück und kein Modell. –

+0

Christoph hat Recht :) – Niall

+0

Super! Das hat funktioniert. Vielen Dank für Ihre Hilfe. – gbdev

0

HTTParty sollte den Inhalt basierend auf dem zurückgegebenen Inhaltstyp automatisch analysieren. Etwas Fischiges scheint mit Zuck's JSon los zu sein.

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\"}" 

Das funktioniert aber OK:

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

nicht zu require 'httparty' vergessen, wenn Sie, dass in der Konsole selbst versuchen.

10

Sie die Antwort erzwingen können als JSON HTTParty.get mit wie so behandelt werden:

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

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

=> "Let It Happen" 
+0

Danke, 'Format' zu merken, von dem Code, den ich dachte, es ist' Parser'. –

5

Sie können response['id'] verwenden, falls, dass die Antwort Content-Type ist application/json oder auch response.parse_response ein Hash erzeugt aus dem JSON Nutzlast zu erhalten .

+0

Das sieht besser aus als die angenommene Antwort! – Antzi