Python + JSON, что случилось с None? - PullRequest
       27

Python + JSON, что случилось с None?

14 голосов
/ 23 августа 2010

Сброс и загрузка текста с ключом None, в результате получается словарь с ключом 'null'.

Значения не затрагиваются, но ситуация становится еще хуже, если действительно существует строковый ключ 'null'.

Что я здесь не так делаю? Почему я не могу сериализовать / десериализовать dict с помощью None ключей?

Пример

>>> json.loads(json.dumps({'123':None, None:'What happened to None?'}))
{u'123': None, u'null': u'What happened to None?'}
>>> json.loads(json.dumps({'123':None, None:'What happened to None?', 'null': 'boom'}))
{u'123': None, u'null': u'boom'}

Ответы [ 3 ]

27 голосов
/ 23 августа 2010

JSON-объекты - это карты строк со значениями. Если вы попытаетесь использовать ключ другого типа, они будут преобразованы в строки.

>>> json.loads(json.dumps({123: None}))
{'123': None}
>>> json.loads(json.dumps({None: None}))
{'null': None}
12 голосов
/ 23 августа 2010

Согласно спецификации , None не является допустимым ключом.Это будет равносильно выражению объекта JSON, которое выглядит как

{ ..., null: ..., ... }

, что недопустимо (т. Е. Не может быть сгенерировано с использованием синтаксической диаграммы.)

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

EDIT Только что увидел, что поведение модуля задокументировано (несколько неявно):

Если для skipkeys задано значение True (по умолчанию: False), то вместо этих ключей будут пропущены ключевые слова, которые не относятся к базовому типу (str, unicode, int, long, float, bool, None)повышение TypeError.

, поэтому кажется, что это поведение является преднамеренным (я все еще нахожу это сомнительным, учитывая текущую спецификацию JSON).

0 голосов
/ 20 ноября 2015

Как показывает @ dan04, None преобразуется в 'null'.
Все хорошо, значение сохраняется в диктанте с помощью «null:« Что случилось с None? »»

Но потом появился еще один ключ с «нулем».
Поэтому старое значение с ключом None / 'null' («Что случилось с None?») Заменяется на «boom».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...