Hallo,
ich habe ein skript das mit urllib2 eine url aufruft. dieses sendet mir einen json string zurück. wie kann ich nun diesen json string in ein python array umwandeln? in php geht das ganz einfach mit json_decode.
ich hab mir die doku bei python.org (2.6.1) durchgelesen aber mir scheint da fehlt die hälfte der bschreibung. einige funktionen aus den beispielen sind nicht dokumentiert !?
Danke!
urllib2 get json string 2 python array
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Code: Alles auswählen
json.loads("[1, 2, 3]")
Wie sieht denn Deine JSON-Struktur aus? Ohne diese Info kann man ja kaum sinnvolle Antworten geben.
hallo,
sorry hab ich in der hizze des gefechts ganz vergessen.
mein json das ich empfange sieht so aus:
so sieht der string us, mir gehts eigentlich nur um die zahlen im list teil da ich die brauche. sieht eh schon fast wie ein array in python aus
sorry hab ich in der hizze des gefechts ganz vergessen.
mein json das ich empfange sieht so aus:
Code: Alles auswählen
{"success":true,"ajaxsuccess":true,"list":[4312,3825,...],"st":172}
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Na, Du bekommst doch zunächst einmal ein dict. In diesem holst Du Dir die Werte des Eintrags "list". Ungetestet in etwa so:
Code: Alles auswählen
d = json.loads("...")
l = d["list"]
print l
Code: Alles auswählen
>>> import json
>>> data = '{"success":true,"ajaxsuccess":true,"list":[4312,3825],"st":172}'
>>> data = json.loads(data)
>>> data['list']
[4312, 3825]
>>>
Das Leben ist wie ein Tennisball.
Ich hab auch noch einen:
Code: Alles auswählen
print json.loads('{"success":true,"ajaxsuccess":true,"list":[4312,3825],"st":172}').get('list', 'da war kein "list" drin :o')
-
- User
- Beiträge: 36
- Registriert: Mittwoch 5. April 2006, 14:11
- Wohnort: Köln
Interessanter Punkt, spielst du auf Security oder "ganz normale" Serverfehler an?jerch hat geschrieben:Das solltest Du aber noch exceptionieren, falls mit dem JSON String Unsinn angeflogen kommt...
Sicherlich auf Serverfehler, wie invalide JSON-Strings. Von sensiblen Daten war bisher auch noch nicht die Rede. Security sollte dann erst eine Ebene später dran sein.Fabian Kochem hat geschrieben:Interessanter Punkt, spielst du auf Security oder "ganz normale" Serverfehler an?
Bis dann,
Sebastian
Das Leben ist wie ein Tennisball.
Ich meinte eher die Securitybelange (vorauseilendes Bedenkenträgertum). Ob er einen JSON-Parsingfehler abfängt oder nicht, muß er selber wissen.
JSON verleitet IMHO sehr schnell zum Variablenschieben zwischen Server/Client, um das stateless des http-Protokolls teilweise zu überbrücken. Leider sind dann auch ohne ausführlichere Prüfung der Werte Injektionszenarien nicht weit entfernt. Ist der Inhalt der Seite dann auch noch usergeneriert ohne <script>-Prüfung, ist das Scheunentor quasi umgefallen
JSON verleitet IMHO sehr schnell zum Variablenschieben zwischen Server/Client, um das stateless des http-Protokolls teilweise zu überbrücken. Leider sind dann auch ohne ausführlichere Prüfung der Werte Injektionszenarien nicht weit entfernt. Ist der Inhalt der Seite dann auch noch usergeneriert ohne <script>-Prüfung, ist das Scheunentor quasi umgefallen
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Und wie willst Du das allgemein mit Exceptions prüfen? Das ist doch von der Domäne abhängig!jerch hat geschrieben:Ich meinte eher die Securitybelange (vorauseilendes Bedenkenträgertum)
...
Leider sind dann auch ohne ausführlichere Prüfung der Werte Injektionszenarien nicht weit entfernt. Ist der Inhalt der Seite dann auch noch usergeneriert ohne <script>-Prüfung, ist das Scheunentor quasi umgefallen
Übrigens, statt den String zu lesen und dann `json.loads()` sollte man natürlich lieber `json.load()` benutzen und dort das "file-like"-Objekt übergeben.
Und zum Thema Encoding: JSON muss im UTF-8 kodiert sein. Ebenfalls möglich laut RFC-4627 ist UTF-16 oder UTF-32, dann muss aber das erste Zeichen ein BOM sein. Interessanterweise sind die mit \u in einem String kodierten Zeichen wiederum UTF-16 (was nur wichtig ist, wenn man Zeichen oberhalb der Basic-Plane kodieren will).
Bei Python < 3.x sollte man immer mit unicode- und nicht mit str-Objekten für die Daten arbeiten. Dann gibt es auch keine Überraschungen mit falschem Encoding. Zu beachten ist, dass urllib2.urlopen() Bytes liefert und keine Zeichen.
Stefan
Und zum Thema Encoding: JSON muss im UTF-8 kodiert sein. Ebenfalls möglich laut RFC-4627 ist UTF-16 oder UTF-32, dann muss aber das erste Zeichen ein BOM sein. Interessanterweise sind die mit \u in einem String kodierten Zeichen wiederum UTF-16 (was nur wichtig ist, wenn man Zeichen oberhalb der Basic-Plane kodieren will).
Bei Python < 3.x sollte man immer mit unicode- und nicht mit str-Objekten für die Daten arbeiten. Dann gibt es auch keine Überraschungen mit falschem Encoding. Zu beachten ist, dass urllib2.urlopen() Bytes liefert und keine Zeichen.
Stefan
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Ah .. ok, dann steht das "s" in loads also für String! Wußte ich auch nicht. Wobei ich dem OP Recht geben muss. Anscheinend ist dort wirklich nicht alles dokumentiert - denn diese beiden Funktionen habe ich in der Doku (2.6) nicht gefunden.sma hat geschrieben:Übrigens, statt den String zu lesen und dann `json.loads()` sollte man natürlich lieber `json.load()` benutzen und dort das "file-like"-Objekt übergeben.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Nennt mich bräsig, aber ich meine zu Hause hätte ich das nicht so vorgefunden. Hier in der Uni sehe ich es jetzt auch (2.6.1 Doku). Das muss ich unbediongt mal nachprüfen.DasIch hat geschrieben:Natürlich ist dass alles dokumentiert. In der Doku sind zig Beispiele und jede Funktion ist ausführlich dokumentiert, was will man den noch mehr?
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
So, ich habe das gerade mal nachgeguckt und dabei entdeckt, dass meine Doku das def. nicht drin hatte.DasIch hat geschrieben:Natürlich ist dass alles dokumentiert. In der Doku sind zig Beispiele und jede Funktion ist ausführlich dokumentiert, was will man den noch mehr?
http://paste.pocoo.org/show/113725/
Das ist alles, was dort zu finden ist in dem Absatz.
War wohl in der Version nicht drin - es kann daher sein, dass das beim OP auch so warWelcome! This is the documentation for Python 2.6, last updated Oct 02, 2008.