2014-04-28 2 views
8

Ich habe ungefähr 2000 JSON-Dateien, die ich versuche, durch ein Python-Programm zu laufen. Ein Problem tritt auf, wenn eine JSON-Datei nicht im richtigen Format vorliegt. (Fehler: ValueError: No JSON object could be decoded) Ich kann es wiederum nicht in mein Programm einlesen.Python: validiere und formatiere JSON-Dateien

ich momentan tue so etwas wie die folgenden:

for files in folder: 
    with open(files) as f: 
     data = json.load(f); # It causes an error at this part 

Ich weiß offline Methoden gibt es zur Validierung und Formatierung von JSON-Dateien aber gibt es eine programmatische Möglichkeit, diese Dateien zu überprüfen und zu formatieren? Wenn nicht, gibt es eine kostenlose/billige Alternative, um alle diese Dateien offline zu reparieren, d. H. Ich führe das Programm einfach in dem Ordner mit allen JSON-Dateien aus und formatiere sie nach Bedarf?


GELöST @ Reece Kommentar mit:

invalid_json_files = [] 
read_json_files = [] 
def parse(): 
    for files in os.listdir(os.getcwd()): 
     with open(files) as json_file: 
      try: 
       simplejson.load(json_file) 
       read_json_files.append(files) 
      except ValueError, e: 
       print ("JSON object issue: %s") % e 
       invalid_json_files.append(files) 
    print invalid_json_files, len(read_json_files) 

aus Turns, dass ich eine Datei spare, die nicht im JSON-Format in meinem Arbeitsverzeichnis, die der gleiche Ort, wo ich war, von Lese von Daten. Danke für die hilfreichen Vorschläge.

+0

Und wie planen Sie, diese Dateien zu reparieren, wenn Sie nicht wissen, wo genau der Fehler ist? – vaultah

+0

Was ist nicht gut formatiert? Sie erkennen, dass Sie das Datenobjekt für jede Datei überschreiben, oder? – Llopis

+0

@frostnational Ich hatte den Eindruck, dass ein Programm einige Probleme durchgehen würde, die in JSON-Dateien auftreten können, und diese automatisch beheben, wenn sie auftreten. Z.B. '{text:" foo "} text2:" bar "' -> kein Komma trennt die beiden Dicts. @Llopis: Ja, ich möchte, dass das Programm für jede JSON-Datei funktioniert. Vielleicht gut formatiert könnte eine Spalte zwischen Dicts fehlen. – Black

Antwort

14

Das Modul eingebaute in JSON als Prüfung verwendet werden können:

import json 

def parse(text): 
    try: 
     return json.loads(text) 
    except ValueError as e: 
     print('invalid json: %s' % e) 
     return None # or: raise 

Sie können es mit Dateien mithilfe funktioniert:

with open(filename) as f: 
    return json.load(f) 

statt json.loads und Sie können den Dateinamen enthalten auch in der Fehlermeldung.

auf Python 3.3.5, für {test: "foo"}, erhalte ich:

invalid json: Expecting property name enclosed in double quotes: line 1 column 2 (char 1) 

und auf 2.7.6:

invalid json: Expecting property name: line 1 column 2 (char 1) 

Dies liegt daran, die richtige json {"test": "foo"} ist.

Beim Umgang mit den ungültigen Dateien ist es am besten, sie nicht weiter zu verarbeiten. Sie können eine skipped.txt-Datei erstellen, die die Dateien mit dem Fehler auflistet, damit sie von Hand überprüft und repariert werden können.

Wenn möglich, sollten Sie die Site/das Programm überprüfen, die die ungültigen JSON-Dateien generiert haben, das beheben und dann die JSON-Datei neu generieren. Andernfalls werden Sie weiterhin neue Dateien haben, die JSON ungültig sind.

Andernfalls müssen Sie einen benutzerdefinierten JSON-Parser schreiben, der häufige Fehler behebt. Damit sollten Sie das Original unter Quellcodeverwaltung (oder archiviert) platzieren, damit Sie die Unterschiede sehen und überprüfen können, die das automatisierte Tool behebt (als Plausibilitätsprüfung). Unklare Fälle sollten von Hand behoben werden.

3

Ja, es gibt Möglichkeiten zu validieren, dass eine JSON-Datei gültig ist. Eine Möglichkeit besteht darin, eine JSON-Parsing-Bibliothek zu verwenden, die Ausnahmen auslöst, wenn die von Ihnen bereitgestellte Eingabe nicht gut formatiert ist.

try: 
    load_json_file(filename) 
except InvalidDataException: # or something 
    # oops guess it's not valid 

Natürlich, wenn Sie es beheben möchten, können Sie natürlich keine JSON-Loader verwenden, da, na ja, es in erster Linie nicht gültig JSON ist. Es sei denn, die Bibliothek, die Sie verwenden, wird automatisch die Dinge für Sie reparieren, in welchem ​​Fall Sie wahrscheinlich nicht diese Frage haben würden.

Eine Möglichkeit besteht darin, die Datei manuell zu laden und zu tokenisieren und zu versuchen, Fehler zu erkennen und zu beheben, aber ich bin mir sicher, dass es Fälle gibt, in denen der Fehler nicht automatisch behoben werden kann besser einen Fehler werfen und den Benutzer bitten, seine Dateien zu reparieren.

Ich habe selbst keinen JSON-Fixer geschrieben, daher kann ich keine Details darüber angeben, wie Sie Fehler beheben könnten.

Ich bin mir jedoch nicht sicher, ob es eine gute Idee wäre, alle Fehler zu beheben, da Sie dann angenommen haben, dass Ihre Korrekturen genau das sind, was der Benutzer wirklich möchte. Wenn es ein fehlendes Komma oder ein zusätzliches abschließendes Komma ist, ist das möglicherweise in Ordnung, aber es kann Fälle geben, in denen es unklar ist, was der Benutzer wünscht.