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}'