Seite 1 von 1

urllib2 get json string 2 python array

Verfasst: Mittwoch 8. April 2009, 09:46
von bcit6k
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!

Verfasst: Mittwoch 8. April 2009, 10:27
von Hyperion

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.

Verfasst: Mittwoch 8. April 2009, 11:01
von bcit6k
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 :)

Verfasst: Mittwoch 8. April 2009, 11:07
von Hyperion
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

Verfasst: Mittwoch 8. April 2009, 11:08
von EyDu

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.

Verfasst: Mittwoch 8. April 2009, 11:16
von jerch
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')

Verfasst: Mittwoch 8. April 2009, 11:19
von bcit6k
hallo,
danke für den hinnweis, das funktioniert nun super! danke!

Verfasst: Mittwoch 8. April 2009, 11:25
von jerch
Das solltest Du aber noch exceptionieren, falls mit dem JSON String Unsinn angeflogen kommt...

Verfasst: Mittwoch 8. April 2009, 15:05
von Fabian Kochem
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?

Verfasst: Mittwoch 8. April 2009, 15:14
von EyDu
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

Verfasst: Mittwoch 8. April 2009, 15:57
von jerch
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 ;)

Verfasst: Mittwoch 8. April 2009, 16:01
von Hyperion
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!

Verfasst: Mittwoch 8. April 2009, 16:18
von jerch
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...

Verfasst: Mittwoch 8. April 2009, 18:23
von sma
Ü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

Verfasst: Mittwoch 8. April 2009, 18:52
von Hyperion
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.

Verfasst: Mittwoch 8. April 2009, 19:05
von DasIch
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?

Verfasst: Donnerstag 9. April 2009, 08:32
von Leonidas
``load()`` vs. ``loads()`` kennt man ja auch aus der API von ``pickle``, dort gibt es auch beide Varianten.

Verfasst: Donnerstag 9. April 2009, 09:28
von Hyperion
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.

Verfasst: Mittwoch 22. April 2009, 18:37
von Hyperion
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 ;-)