Обработка ленивого JSON в Python - «Ожидание имени свойства»

Использование модуля 'json' Pythons (2.7) Я ищу для обработки различных каналов JSON К сожалению, некоторые из этих каналов не соответствуют стандартам JSON - в частности, некоторые ключи не заключены в двойные речевые знаки ("). Это вызывает ошибку в Python.

Перед тем, как написать ужасный кусок кода для синтаксического анализа и восстановления входящих данных, я подумал, что спрошу - есть ли способ позволить Python либо анализировать этот искаженный JSON, либо «восстанавливать» данные так, чтобы это был бы действительный JSON?

Рабочий пример

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

Неисправный пример

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)

Я написал небольшой REGEX, чтобы исправить JSON, исходящий от этого конкретного поставщика, но я предвижу, что это станет проблемой в будущем. Вот то, что я придумал.

>>> 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}'
47
задан Seidr 27 October 2010 в 14:18
поделиться