Есть ли способ сделать simplejson менее строгим? - PullRequest
6 голосов
/ 02 февраля 2012

Мне интересно, чтобы simplejson.loads() успешно проанализировал следующее:

{foo:3}

Он выдает JSONDecodeError, говорящий «ожидающий имя свойства», но в действительности он говорит: «Мне нужны двойные кавычки вокруг имен моих свойств». Это раздражает в моем случае использования, и я бы предпочел менее строгое поведение. Я читал документы, но помимо создания собственного класса декодера, я не вижу ничего очевидного, что изменит это поведение.

Ответы [ 3 ]

10 голосов
/ 02 февраля 2012

Вы можете использовать YAML (> = 1.2), так как это расширенный набор JSON, вы можете сделать:

>>> import yaml
>>> s = '{foo: 8}'
>>> yaml.load(s)
{'foo': 8}
2 голосов
/ 26 ноября 2014

Вы можете попробовать demjson .

>>> import demjson
>>> demjson.decode('{foo:3}')
{u'foo': 3}
1 голос
/ 02 февраля 2012

Нет, это невозможно. Чтобы успешно разобрать это с помощью simplejson, вам сначала нужно преобразовать его в допустимую строку JSON.

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

В простом случае, если у вас всегда будет объект JSON, в котором в качестве значений используются только буквы и подчеркивания в ключах (без кавычек) и целые числа, вы можете использовать следующее для преобразования его в действительный JSON:

import re
your_string = re.sub(r'([a-zA-Z_]+)', r'"\1"', your_string)

Например:

>>> re.sub(r'([a-zA-Z_]+)', r'"\1"', '{foo:3, bar:4}')
'{"foo":3, "bar":4}'
...