Python не может разобрать JSON с дополнительной запятой - PullRequest
0 голосов
/ 04 октября 2018

Этот код:

import json
s = '{ "key1": "value1", "key2": "value2", }'
json.loads(s)

выдает эту ошибку в Python 2:

ValueError: Ожидаемое имя свойства: строка 1 столбец 16 (символ 15)

Аналогичный результат в Python 3:

json.decoder.JSONDecodeError: Ожидаемое имя свойства заключено в двойные кавычки: строка 1, столбец 16 (символ 15)

Если я удалю эту запятую (после "value2"), я не получу ошибку.Но мой код будет обрабатывать много разных JSON, поэтому я не могу сделать это вручную.Можно ли настроить парсер на игнорирование таких последних запятых?

Ответы [ 5 ]

0 голосов
/ 04 октября 2018

Возможно, этот поток данных равен JSON5 , и в этом случае для этого есть синтаксический анализатор: https://pypi.org/project/json5/

Эта ситуация может быть облегчена Подстановка регулярных выражений, которая ищет ", } и заменяет ее на " }, допуская любое количество пробелов между кавычками, запятыми и близкими кавычками.

>>> import re
>>> s = '{ "key1": "value1", "key2": "value2", }'
>>> re.sub(r"\"\s*,\s*\}", "\" }", s)
'{ "key1": "value1", "key2": "value2" }'

Предоставление:

>>> import json
>>> s2 = re.sub(r"\"\s*,\s*\}", "\" }", s)
>>> json.loads(s2)
{'key1': 'value1', 'key2': 'value2'}

РЕДАКТИРОВАТЬ: как прокомментировано, это не очень хорошая практика, если вы не уверены, что ваши данные JSON содержат только простые слова, и это изменение больше не портит поток данных.Как я прокомментировал OP, лучший способ действий состоит в том, чтобы восстановить восходящий источник данных.Но иногда это невозможно.

0 голосов
/ 04 октября 2018

Как насчет использования следующего регулярного выражения?

s = re.sub(r",\s*}", "}", s)
0 голосов
/ 04 октября 2018

Спецификация JSON не допускает использование запятой.Парсер выбрасывает, поскольку он обнаружил неверный синтаксический токен.

Возможно, вас заинтересует использование другого анализатора для этих файлов, например.парсер, созданный для JSON5 spec , который допускает такой синтаксис.

0 голосов
/ 04 октября 2018

Я подозреваю, что он не анализируется, потому что "это не json", но вы можете предварительно обработать строки, используя регулярное выражение для замены , } на } и , ] на ]

0 голосов
/ 04 октября 2018

Это потому, что дополнительный , недопустим в соответствии с JSON стандартным .

Объектом является неупорядоченный набор пар имя / значение.Объект начинается с {(левая скобка) и заканчивается} (правая скобка).Каждое имя сопровождается: (двоеточие) и пары имя / значение разделяются, (запятая).

enter image description here

Если вы действительноесли это нужно, вы можете обернуть json-анализатор Python с помощью jsoncomment .Но я бы попытался исправить JSON в источнике.

...