2010-12-19 7 views
0

Ich brauche die Variablen alle in dieser JSON-Antwort zu schreiben:Wie Charaktere entweichen kann, wenn JSON Lesen

"result": { 
    "\/common\/topic\/weblink": [ 
     { 
     "url": "http:\/\/www.boardgamegeek.com\/boardgame\/13", 
     "description": "BoardGameGeek" 
     } 
    ], 
    "id": "\/en\/settlers_of_catan" 
    } 

So die ID zu erhalten:

result.id 

Aber wie bekomme ich die Werte für "\/common \/topic \/weblink"?

+0

Welche Bibliothek verwenden Sie derzeit, um den JSON zu verarbeiten? –

+0

Ich verwende Freebase-Python: http://code.google.com/p/freebase-python/ –

+0

Basierend auf einem Beispiel in Freebase-Python sollte dies funktionieren - Ergebnis ["\/common \/topic \/weblink "] [" url "] - aber es wirft den Fehler, - TemplateSyntaxError: Der Rest konnte nicht analysiert werden: [" \/common \/topic \/weblink "] [" url "] –

Antwort

0

Sie wollen so etwas wie

result["\/common\/topic\/weblink"][0].url 

(glaube ich)

+0

Ich dachte das könnte auch funktionieren, aber keine Würfel. –

+0

Nur zur Klarheit hat Ihr Beispiel einen Tippfehler. Es sollte sein: Ergebnis ["\/common \/topic \/weblink"] [0] .url –

+0

Dies endete damit, die richtige Antwort zu sein. Ich habe das Ergebnisobjekt an eine HTML-Vorlage übergeben, und aus irgendeinem mir unbekannten Grund habe ich Schwierigkeiten beim Zugriff auf Schlüssel aus dem JSON-Ergebnis, aber es gibt keine Probleme beim Zugriff auf sie innerhalb der Python-Klasse. –

0

Versuchen

result.__getattribute__("\/common\/topic\/weblink")[0].url 
+0

TemplateSyntaxError: Variablen und Attribute dürfen nicht mit Unterstrichen beginnen:' result .__ getattribute__ ' –

2

"\/common\/topic\/weblink"/common/topic/weblink auf die Zeichenfolge aufgelöst wird. Jede API, die auf den dekodierten Inhalt zugreift, sollte die resultierenden nicht-entdeckten Daten verwenden; Das Ausbrechen ist nur ein Teil der JSON-Kodierung.

Dies funktioniert gut, das Standard-JSON-Modul in Python enthalten verwenden, die ich Sie verwenden, anstatt von Drittanbietern diejenigen dringend empfohlen, wenn Sie einen sehr guten Grund haben, anders zu sein:

import json 

json_data = r""" 
{ 
    "result": { 
    "\/common\/topic\/weblink": [ 
     { 
     "url": "http:\/\/www.boardgamegeek.com\/boardgame\/13", 
     "description": "BoardGameGeek" 
     } 
    ], 
    "id": "\/en\/settlers_of_catan" 
    } 
}""" 

data = json.loads(json_data) 
print data["result"]["/common/topic/weblink"] 

Beachten Sie, dass Sie habe die umschließenden Klammern auf dem Objekt weggelassen, die ich hinzugefügt habe.

+0

Danke Glenn, ich bin auf Python 2.5.5 als eine Einschränkung von Google App Engine.Ich glaube, dass JSON mit 2.6 eingeführt wurde.Lasst mich es ausprobieren. –

+0

Es kann "Simplejson" genannt werden, wenn es in älteren Versionen von Python installiert ist. (Beachten Sie, dass jeder Hosting-Dienst was immer noch auf 2,5 im Jahr 2010 ist, ist offensichtlich nicht vernünftig gepflegt, und sollte nicht für etwas nicht trivial berücksichtigt werden.) –

+0

Ich denke, ich bin in der Nähe. Ich importierte simplejson. Und versuchte die Lasten Funktion. >>> json_result = simplejson. Lasten (Ergebnis) Ich bekomme jedoch einen Fehler (TypeError: expect ed string oder buffer), da das Ergebnisobjekt kein String ist. –