Выгрузка и загрузка словаря с ключом 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'}
Объекты JSON - это сопоставления строк значениям. Если вы попытаетесь использовать другой тип ключа, они будут преобразованы в строки.
>>> json.loads(json.dumps({123: None}))
{'123': None}
>>> json.loads(json.dumps({None: None}))
{'null': None}
Согласно спецификации, None
не является допустимым ключом. Это равносильно выражению объекта JSON, которое выглядит как
{ ..., null: ..., ... }
которое не является допустимым (т.е. не может быть сгенерировано с использованием синтаксической диаграммы.)
Возможно, модуль JSON должен был выдать исключение при сериализации вместо того, чтобы молча генерировать строковое представление значения.
EDIT Только что увидел, что поведение модуля документировано (несколько неявно):
Если skipkeys равен True (по умолчанию: False), то ключи dict, которые не являются базовым типом (str, unicode, int, long, float, bool, None), будут пропущены вместо того, чтобы вызвать TypeError.
так что кажется, что такое поведение намеренное (я все еще нахожу его сомнительным, учитывая текущую спецификацию JSON).