Handling Lazy JSON in Python - 'Erwarten des Eigenschaftsnamens'

Mit dem Pythons (2.7) 'json'-Modul möchte ich verschiedene JSON-Feeds verarbeiten. Leider entsprechen einige dieser Feeds nicht den JSON-Standards - insbesondere sind einige Schlüssel nicht in doppelte Sprachmarken (") eingeschlossen. Dies führt dazu, dass Python fehlerhaft arbeitet.

Vor dem Schreiben eines verdammt hässlichen Codes zum Parsen und Reparieren der eingehenden Daten habe ich mich gefragt: Gibt es eine Möglichkeit, dass Python diesen fehlerhaften JSON entweder parst oder die Daten so 'repariert', dass sie es tun würden? Gültiger JSON?

Arbeitsbeispiel

import json
>>> json.loads('{"key1":1,"key2":2,"key3":3}')
{'key3': 3, 'key2': 2, 'key1': 1}

Brochenes Beispiel

import json
>>> json.loads('{key1:1,key2:2,key3:3}')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\json\__init__.py", line 310, in loads
    return _default_decoder.decode(s)
  File "C:\Python27\lib\json\decoder.py", line 346, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Python27\lib\json\decoder.py", line 362, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Expecting property name: line 1 column 1 (char 1)

Ich habe ein kleines REGEX geschrieben, um den JSON-Fehler zu beheben, der von diesem bestimmten Anbieter stammt, aber ich sehe, dass dies in Zukunft ein Problem sein wird. Unten ist, was ich mir ausgedacht habe.

>>> import re
>>> s = '{key1:1,key2:2,key3:3}'
>>> s = re.sub('([{,])([^{:\s"]*):', lambda m: '%s"%s":'%(m.group(1),m.group(2)),s)
>>> s
'{"key1":1,"key2":2,"key3":3}'

Antworten auf die Frage(12)

Ihre Antwort auf die Frage