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

Выгрузка и загрузка словаря с ключом 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'}
19
задан Filipp W. 25 July 2018 в 06:40
поделиться

2 ответа

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

>>> json.loads(json.dumps({123: None}))
{'123': None}
>>> json.loads(json.dumps({None: None}))
{'null': None}
28
ответ дан 30 November 2019 в 03:11
поделиться

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

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

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

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

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

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

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

12
ответ дан 30 November 2019 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: