Как разобрать несколько неправильный JSON с Python?
У меня есть следующая строка JSON из внешнего источника ввода:
{value: "82363549923gnyh49c9djl239pjm01223", id: 17893}
Это неправильно отформатированная строка JSON ("id" и "value" должны быть в кавычках), но мне все равно нужно ее проанализировать. Я пробовал simplejson и json-py и кажется, что они не могут быть настроены для разбора таких строк.
Я использую Python 2.5 на движке Google App, поэтому любые решения на основе C, такие как python-cjson, неприменимы.
Формат ввода может быть изменен на XML или YAML, в дополнение к JSON, указанному выше, но я использую JSON в проекте, и изменение формата в определенном месте не очень хорошо.
Теперь я перешел на XML и успешно анализирую данные, но с нетерпением жду любого решения, которое позволило бы мне вернуться к JSON.
5 ответов
Поскольку YAML (>=1.2) является надмножеством JSON, вы можете сделать:
>>> import yaml
>>> s = '{value: "82363549923gnyh49c9djl239pjm01223", id: 17893}'
>>> yaml.load(s)
{'id': 17893, 'value': '82363549923gnyh49c9djl239pjm01223'}
Вы можете использовать demjson.
>>> import demjson
>>> demjson.decode('{foo:3}')
{u'foo': 3}
Вы можете использовать анализатор строк, чтобы исправить это в первую очередь, регулярное выражение может сделать это при условии, что это так сложно, как это сделает JSON.
Библиотека dirtyjson может обрабатывать некоторые почти правильные JSON:
>>> import dirtyjson
>>>
>>> s = '{value: "82363549923gnyh49c9djl239pjm01223", id: 17893}'
>>> d = dirtyjson.loads(s)
>>> d
AttributedDict([('value', '82363549923gnyh49c9djl239pjm01223'), ('id', 17893)])
>>>
>>> d = dict(d)
>>> d
{'value': '82363549923gnyh49c9djl239pjm01223', 'id': 17893}
>>> d["value"]
'82363549923gnyh49c9djl239pjm01223'
>>> d["id"]
17893
Pyparsing включает в себя пример парсера JSON, вот источник в Интернете. Вы можете изменить определение memberDef, чтобы разрешить строку без кавычек для имени члена, а затем использовать ее для синтаксического анализа исходного текста, который не совсем JSON.
На этой странице также есть информация и ссылка на мою статью в журнале Python Magazine за август 2008 года, в которой содержится гораздо более подробная информация об этом анализаторе. На странице показан пример JSON и код, который обращается к проанализированным результатам, как будто это десериализованный объект.