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

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: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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

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

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: 1669
Registriert: Mittwoch 4. März 2009, 14:19

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

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

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

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: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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: 1669
Registriert: Mittwoch 4. März 2009, 14:19

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: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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: 1669
Registriert: Mittwoch 4. März 2009, 14:19

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

Ü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: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

``load()`` vs. ``loads()`` kennt man ja auch aus der API von ``pickle``, dort gibt es auch beide Varianten.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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

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?
So, ich habe das gerade mal nachgeguckt und dabei entdeckt, dass meine Doku das def. nicht drin hatte.

http://paste.pocoo.org/show/113725/

Das ist alles, was dort zu finden ist in dem Absatz.
Welcome! This is the documentation for Python 2.6, last updated Oct 02, 2008.
War wohl in der Version nicht drin - es kann daher sein, dass das beim OP auch so war ;-)
Antworten