urllib2 get json string 2 python array

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
bcit6k
User
Beiträge: 77
Registriert: Mittwoch 23. Juli 2008, 08:50

Mittwoch 8. April 2009, 09:46

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!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mittwoch 8. April 2009, 10:27

Code: Alles auswählen

json.loads("[1, 2, 3]")
sollte doch tun!

Wie sieht denn Deine JSON-Struktur aus? Ohne diese Info kann man ja kaum sinnvolle Antworten geben.
bcit6k
User
Beiträge: 77
Registriert: Mittwoch 23. Juli 2008, 08:50

Mittwoch 8. April 2009, 11:01

hallo,

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}
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 :)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mittwoch 8. April 2009, 11:07

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
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Mittwoch 8. April 2009, 11:08

Code: Alles auswählen

>>> import json
>>> data = '{"success":true,"ajaxsuccess":true,"list":[4312,3825],"st":172}'
>>> data = json.loads(data)
>>> data['list']
[4312, 3825]
>>>
Da könntest du aber auch selber drauf kommen. Habe vorher noch nie Json benutz und das in einer Minute zusammengeschrieben.
Das Leben ist wie ein Tennisball.
jerch
User
Beiträge: 1630
Registriert: Mittwoch 4. März 2009, 14:19

Mittwoch 8. April 2009, 11:16

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')
bcit6k
User
Beiträge: 77
Registriert: Mittwoch 23. Juli 2008, 08:50

Mittwoch 8. April 2009, 11:19

hallo,
danke für den hinnweis, das funktioniert nun super! danke!
jerch
User
Beiträge: 1630
Registriert: Mittwoch 4. März 2009, 14:19

Mittwoch 8. April 2009, 11:25

Das solltest Du aber noch exceptionieren, falls mit dem JSON String Unsinn angeflogen kommt...
Fabian Kochem
User
Beiträge: 36
Registriert: Mittwoch 5. April 2006, 14:11
Wohnort: Köln

Mittwoch 8. April 2009, 15:05

jerch hat geschrieben:Das solltest Du aber noch exceptionieren, falls mit dem JSON String Unsinn angeflogen kommt...
Interessanter Punkt, spielst du auf Security oder "ganz normale" Serverfehler an?
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Mittwoch 8. April 2009, 15:14

Fabian Kochem hat geschrieben:Interessanter Punkt, spielst du auf Security oder "ganz normale" Serverfehler an?
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.

Bis dann,
Sebastian
Das Leben ist wie ein Tennisball.
jerch
User
Beiträge: 1630
Registriert: Mittwoch 4. März 2009, 14:19

Mittwoch 8. April 2009, 15:57

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 ;)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mittwoch 8. April 2009, 16:01

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 ;)
Und wie willst Du das allgemein mit Exceptions prüfen? Das ist doch von der Domäne abhängig!
jerch
User
Beiträge: 1630
Registriert: Mittwoch 4. März 2009, 14:19

Mittwoch 8. April 2009, 16:18

Und wie willst Du das allgemein mit Exceptions prüfen? Das ist doch von der Domäne abhängig!
:oops: Entschuldigt bitte, hab das urllib überlesen und war im Servermodus gelandet...
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Mittwoch 8. April 2009, 18:23

Ü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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mittwoch 8. April 2009, 18:52

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.
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.
Antworten