Python String mit Json parsen

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
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Hallo zusammen,

ich versuche gerade das Tool lsdvd mit meinem Python-Skript zu nutzen. lsdvd bietet dabei die schöne Möglichkeit, die Ausgabe in Python-Syntax vorzunehmen, so dass ich mir das fehlerträchtige Parsen der Ausgabe schenken kann.

Die Ausgabe sieht dabei wie folgt aus: http://www.python-forum.de/pastebin.php?mode=view&s=22

Um das Ganze mit Json verarbeiten zu können, entferne ich zunächst die Zeichenkette "lsdvd = " am Anfang und ersetze die SingleQuotes durch DoubleQuotes. So bleibt ja eigentlich nur eine String-Repräsentation eines verschachtelten Dicts, das man mit Json einlesen können müsste. Wenn ich Json nun aber darüberlaufen lassen

Code: Alles auswählen

j = json.JSONDecoder()
j.raw_decode(lsdvd_ret)
erhalte ich folgenden Fehler:
ValueError: Expecting property name: line 16 column 9 (char 333)
Vermutlich muss ich den String noch "escapen", bevor ich ihn an Json weiterreichen kann. Hat jemand eine Idee, wie ich das machen könnte? Auf eval würde ich gerne verzichten (das hat aber bei einem Test problemlos funktioniert).

Besten Dank schonmal für eure Zeit,

brb
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Wenn du das "lsdvd = " vorher entfernst, könntest du es mit `ast.literal_eval()` laden und dann wieder als JSON ausgeben.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Danke, das kannte ich noch nicht. Scheint genau das zu sein, was ich gesucht habe. Besten dank!
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Der Fehler kommt übrigens daher, dass diverse Zeilen ein Komma vor einer schließenden Klammer enthalten, was kein gültiges JSON-Format ist. Dass die ' zu " werden müssen, hattest du ja schon erkannt. So geht's:

Code: Alles auswählen

import json, re
print(json.loads(re.sub(r",([\s\n]*[\]}])", "\\1", s).replace("lsdvd = ", "").replace("'", '"')))
Stefan
Antworten