json.md
1> **Источник:** https://python-all.ru/3.3/library/json.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 19.2. [`json`](https://python-all.ru/3.3/library/json.html#module-json) – кодировщик и декодировщик JSON89[JSON (JavaScript Object Notation)](https://python-all.ru/3.3/library/json.html), определённый в [**RFC 4627**](https://python-all.ru/3.3/library/json.html), это легковесный формат обмена данными, основанный на подмножестве синтаксиса [JavaScript](https://python-all.ru/3.3/library/json.html) ([ECMA-262, 3-е издание](https://python-all.ru/3.3/library/json.html)).1011[`json`](https://python-all.ru/3.3/library/json.html#module-json) предоставляет API, знакомый пользователям модулей [`marshal`](https://python-all.ru/3.3/library/marshal.html#module-marshal) и [`pickle`](https://python-all.ru/3.3/library/pickle.html#module-pickle) из стандартной библиотеки.1213Кодирование иерархий базовых объектов Python:1415```python16>>> import json17>>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])18'["foo", {"bar": ["baz", null, 1.0, 2]}]'19>>> print(json.dumps("\"foo\bar"))20"\"foo\bar"21>>> print(json.dumps('\u1234'))22"\u1234"23>>> print(json.dumps('\\'))24"\\"25>>> print(json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True))26{"a": 0, "b": 0, "c": 0}27>>> from io import StringIO28>>> io = StringIO()29>>> json.dump(['streaming API'], io)30>>> io.getvalue()31'["streaming API"]'32```3334Компактное кодирование:3536```python37>>> import json38>>> json.dumps([1,2,3,{'4': 5, '6': 7}], separators=(',', ':'))39'[1,2,3,{"4":5,"6":7}]'40```4142Красивое форматирование:4344```python45>>> import json46>>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True,47... indent=4, separators=(',', ': ')))48{49 "4": 5,50 "6": 751}52```5354Декодирование JSON:5556```python57>>> import json58>>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')59['foo', {'bar': ['baz', None, 1.0, 2]}]60>>> json.loads('"\\"foo\\bar"')61'"foo\x08ar'62>>> from io import StringIO63>>> io = StringIO('["streaming API"]')64>>> json.load(io)65['streaming API']66```6768Специализированное декодирование объектов JSON:6970```python71>>> import json72>>> def as_complex(dct):73... if '__complex__' in dct:74... return complex(dct['real'], dct['imag'])75... return dct76...77>>> json.loads('{"__complex__": true, "real": 1, "imag": 2}',78... object_hook=as_complex)79(1+2j)80>>> import decimal81>>> json.loads('1.1', parse_float=decimal.Decimal)82Decimal('1.1')83```8485Расширение [`JSONEncoder`](https://python-all.ru/3.3/library/json.html#json.JSONEncoder):8687```python88>>> import json89>>> class ComplexEncoder(json.JSONEncoder):90... def default(self, obj):91... if isinstance(obj, complex):92... return [obj.real, obj.imag]93... # Пусть метод базового класса по умолчанию возбуждает TypeError94... return json.JSONEncoder.default(self, obj)95...96>>> json.dumps(2 + 1j, cls=ComplexEncoder)97'[2.0, 1.0]'98>>> ComplexEncoder().encode(2 + 1j)99'[2.0, 1.0]'100>>> list(ComplexEncoder().iterencode(2 + 1j))101['[2.0', ', 1.0', ']']102```103104Использование json.tool из командной оболочки для проверки и форматирования:105106```bash107$ echo '{"json":"obj"}' | python -mjson.tool108{109 "json": "obj"110}111$ echo '{1.2:3.4}' | python -mjson.tool112Expecting property name enclosed in double quotes: line 1 column 2 (char 1)113```114115> **Примечание**116>117> JSON является подмножеством [YAML](https://python-all.ru/3.3/library/json.html) 1.2. JSON, создаваемый настройками модуля по умолчанию (в частности, значением *separators* по умолчанию), также является подмножеством YAML 1.0 и 1.1. Таким образом, этот модуль можно использовать как сериализатор YAML.118119## 19.2.1. Основное использование120121#### `json.dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)`122123Сериализует *obj* в поток в формате JSON в *fp* (`.write()`-совместимый [*файлоподобный объект*](https://python-all.ru/3.3/glossary.html#term-file-like-object)) с помощью этой [*таблицы преобразования*](https://python-all.ru/3.3/library/json.html#py-to-json-table).124125Если *skipkeys* равно `True` (по умолчанию: `False`), то ключи словаря, не являющиеся базовыми типами ([`str`](https://python-all.ru/3.3/library/stdtypes.html#str), [`int`](https://python-all.ru/3.3/library/functions.html#int), [`float`](https://python-all.ru/3.3/library/functions.html#float), [`bool`](https://python-all.ru/3.3/library/functions.html#bool), `None`), будут пропущены вместо возбуждения исключения [`TypeError`](https://python-all.ru/3.3/library/exceptions.html#TypeError).126127Модуль [`json`](https://python-all.ru/3.3/library/json.html#module-json) всегда создает объекты [`str`](https://python-all.ru/3.3/library/stdtypes.html#str), а не [`bytes`](https://python-all.ru/3.3/library/functions.html#bytes). Поэтому `fp.write()` должен поддерживать ввод [`str`](https://python-all.ru/3.3/library/stdtypes.html#str).128129Если *ensure\_ascii* равен `True` (по умолчанию), то гарантируется, что все входящие не-ASCII символы будут экранированы. Если *ensure\_ascii* равен `False`, эти символы будут выводиться как есть.130131Если *check\_circular* равно `False` (по умолчанию: `True`), то проверка циклических ссылок для контейнерных типов будет пропущена, и циклическая ссылка приведет к [`OverflowError`](https://python-all.ru/3.3/library/exceptions.html#OverflowError) (или хуже).132133Если *allow\_nan* равно `False` (по умолчанию: `True`), то сериализация значений [`float`](https://python-all.ru/3.3/library/functions.html#float) вне допустимого диапазона (`nan`, `inf`, `-inf`) будет вызывать [`ValueError`](https://python-all.ru/3.3/library/exceptions.html#ValueError) в строгом соответствии со спецификацией JSON, вместо использования JavaScript-эквивалентов (`NaN`, `Infinity`, `-Infinity`).134135Если *indent* – неотрицательное целое число или строка, то элементы массива JSON и члены объекта будут выводиться с отступами на указанный уровень. Уровень отступа 0, отрицательный или `""` приведёт только к вставке новых строк. `None` (по умолчанию) выбирает наиболее компактное представление. Использование положительного целого числа задаёт отступ в указанное количество пробелов на уровень. Если *indent* – строка (например, `"\t"`), то эта строка используется для отступа на каждом уровне.136137Изменено в версии 3.2: Разрешено использование строк для *indent* в дополнение к целым числам.138139> **Примечание**140>141> Поскольку разделителем элементов по умолчанию является `', '`, в выводе может появиться конечный пробел, если указан параметр *indent*. Чтобы этого избежать, можно использовать `separators=(',', ': ')`.142143Если *separators* является кортежем `(item_separator, dict_separator)`, то он будет использоваться вместо разделителей по умолчанию `(', ', ': ')`. `(',', ':')` – это наиболее компактное представление JSON.144145*default(obj)* – это функция, которая должна возвращать сериализуемую версию *obj* или возбуждать [`TypeError`](https://python-all.ru/3.3/library/exceptions.html#TypeError). По умолчанию просто возбуждается [`TypeError`](https://python-all.ru/3.3/library/exceptions.html#TypeError).146147Если *sort\_keys* равно `True` (по умолчанию: `False`), то вывод словарей будет отсортирован по ключам.148149Чтобы использовать пользовательский подкласс [`JSONEncoder`](https://python-all.ru/3.3/library/json.html#json.JSONEncoder) (например, переопределяющий метод `default()` для сериализации дополнительных типов), укажите его в аргументе *cls*; в противном случае используется [`JSONEncoder`](https://python-all.ru/3.3/library/json.html#json.JSONEncoder).150151#### `json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)`152153Сериализует *obj* в [`str`](https://python-all.ru/3.3/library/stdtypes.html#str) в формате JSON с помощью этой [*таблицы преобразования*](https://python-all.ru/3.3/library/json.html#py-to-json-table). Аргументы имеют тот же смысл, что и в [`dump()`](https://python-all.ru/3.3/library/json.html#json.dump).154155> **Примечание**156>157> В отличие от [`pickle`](https://python-all.ru/3.3/library/pickle.html#module-pickle) и [`marshal`](https://python-all.ru/3.3/library/marshal.html#module-marshal), JSON не является протоколом с обрамлением, поэтому попытка сериализовать несколько объектов с помощью повторных вызовов [`dump()`](https://python-all.ru/3.3/library/json.html#json.dump) с одним и тем же *fp* приведет к созданию недопустимого JSON-файла.158159> **Примечание**160>161> Ключи в парах ключ-значение JSON всегда имеют тип [`str`](https://python-all.ru/3.3/library/stdtypes.html#str). Когда словарь преобразуется в JSON, все ключи словаря приводятся к строкам. В результате, если словарь преобразуется в JSON, а затем обратно в словарь, полученный словарь может не совпадать с исходным. То есть `loads(dumps(x)) != x`, если x содержит нестроковые ключи.162163#### `json.load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)`164165Десериализует *fp* (`.read()`-совместимый [*файлоподобный объект*](https://python-all.ru/3.3/glossary.html#term-file-like-object), содержащий JSON-документ) в объект Python с помощью этой [*таблицы преобразования*](https://python-all.ru/3.3/library/json.html#json-to-py-table).166167*object\_hook* – необязательная функция, которая будет вызвана с результатом декодирования любого объектного литерала (словаря [`dict`](https://python-all.ru/3.3/library/stdtypes.html#dict)). Возвращаемое значение *object\_hook* будет использовано вместо [`dict`](https://python-all.ru/3.3/library/stdtypes.html#dict). Эта возможность может использоваться для реализации собственных декодеров (например, [JSON-RPC](https://python-all.ru/3.3/library/json.html) class hinting).168169*object\_pairs\_hook* – необязательная функция, которая будет вызвана с результатом декодирования любого объектного литерала в виде упорядоченного списка пар. Возвращаемое значение *object\_pairs\_hook* будет использовано вместо [`dict`](https://python-all.ru/3.3/library/stdtypes.html#dict). Эта возможность может использоваться для реализации собственных декодеров, которые полагаются на порядок декодирования пар ключ-значение (например, [`collections.OrderedDict()`](https://python-all.ru/3.3/library/collections.html#collections.OrderedDict) запомнит порядок вставки). Если также определен *object\_hook*, *object\_pairs\_hook* имеет приоритет.170171Изменено в версии 3.1: Добавлена поддержка *object\_pairs\_hook*.172173*parse\_float*, если указан, будет вызван со строкой каждого декодируемого JSON-числа с плавающей точкой. По умолчанию это эквивалентно `float(num_str)`. Это можно использовать для применения другого типа данных или парсера для JSON чисел с плавающей точкой (например, [`decimal.Decimal`](https://python-all.ru/3.3/library/decimal.html#decimal.Decimal)).174175*parse\_int*, если указан, будет вызван со строкой каждого декодируемого JSON-целого числа. По умолчанию это эквивалентно `int(num_str)`. Это можно использовать для применения другого типа данных или парсера для JSON целых чисел (например, [`float`](https://python-all.ru/3.3/library/functions.html#float)).176177*parse\_constant*, если указан, будет вызываться с одной из следующих строк: `'-Infinity'`, `'Infinity'`, `'NaN'`. Это можно использовать для возбуждения исключения при обнаружении недопустимых чисел JSON.178179Изменено в версии 3.1: *parse\_constant* больше не вызывается для ‘null’, ‘true’, ‘false’.180181Чтобы использовать пользовательский подкласс [`JSONDecoder`](https://python-all.ru/3.3/library/json.html#json.JSONDecoder), укажите его в аргументе `cls`; в противном случае используется [`JSONDecoder`](https://python-all.ru/3.3/library/json.html#json.JSONDecoder). Дополнительные ключевые аргументы будут переданы конструктору класса.182183#### `json.loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)`184185Десериализует *s* (экземпляр [`str`](https://python-all.ru/3.3/library/stdtypes.html#str), содержащий JSON-документ) в объект Python, используя данную [*таблицу преобразования*](https://python-all.ru/3.3/library/json.html#json-to-py-table).186187Остальные аргументы имеют тот же смысл, что и в [`load()`](https://python-all.ru/3.3/library/json.html#json.load), за исключением *encoding*, который игнорируется и является устаревшим.188189## 19.2.2. Кодировщики и декодировщики190191#### `class json.JSONDecoder(object_hook=None, parse_float=None, parse_int=None, parse_constant=None, strict=True, object_pairs_hook=None)`192193Простой JSON-декодер.194195По умолчанию выполняет следующие преобразования при декодировании:196197| JSON | Python |198| --- | --- |199| объект | dict |200| массив | список |201| строка | str |202| число (int) | int |203| число (вещественное) | float |204| истина | True |205| ложь | False |206| null | None |207208Он также понимает `NaN`, `Infinity` и `-Infinity` как соответствующие значения `float`, что выходит за рамки спецификации JSON.209210*object\_hook*, если указан, будет вызван с результатом декодирования каждого JSON-объекта, и его возвращаемое значение будет использовано вместо переданного [`dict`](https://python-all.ru/3.3/library/stdtypes.html#dict). Это может быть использовано для предоставления пользовательских десериализаций (например, для поддержки JSON-RPC подсказок классов).211212*object\_pairs\_hook*, если указан, будет вызван с результатом декодирования каждого JSON-объекта, представленным в виде упорядоченного списка пар. Возвращаемое значение *object\_pairs\_hook* будет использовано вместо [`dict`](https://python-all.ru/3.3/library/stdtypes.html#dict). Эта возможность может быть использована для реализации пользовательских декодеров, которые полагаются на порядок декодирования пар ключ-значение (например, [`collections.OrderedDict()`](https://python-all.ru/3.3/library/collections.html#collections.OrderedDict) запомнит порядок вставки). Если *object\_hook* также определён, то *object\_pairs\_hook* имеет приоритет.213214Изменено в версии 3.1: Добавлена поддержка *object\_pairs\_hook*.215216*parse\_float*, если указан, будет вызван со строкой каждого декодируемого JSON-числа с плавающей точкой. По умолчанию это эквивалентно `float(num_str)`. Это можно использовать для применения другого типа данных или парсера для JSON чисел с плавающей точкой (например, [`decimal.Decimal`](https://python-all.ru/3.3/library/decimal.html#decimal.Decimal)).217218*parse\_int*, если указан, будет вызван со строкой каждого декодируемого JSON-целого числа. По умолчанию это эквивалентно `int(num_str)`. Это можно использовать для применения другого типа данных или парсера для JSON целых чисел (например, [`float`](https://python-all.ru/3.3/library/functions.html#float)).219220*parse\_constant*, если указан, будет вызван с одной из следующих строк: `'-Infinity'`, `'Infinity'`, `'NaN'`, `'null'`, `'true'`, `'false'`. Это может быть использовано для возбуждения исключения при обнаружении недопустимых JSON чисел.221222Если *strict* равен `False` (`True` – значение по умолчанию), то управляющие символы будут разрешены внутри строк. Управляющие символы в данном контексте – это символы с кодами в диапазоне 0–31, включая `'\t'` (табуляция), `'\n'` (новая строка), `'\r'` (возврат каретки) и `'\0'`.223224Если десериализуемые данные не являются корректным JSON-документом, будет возбуждено исключение [`ValueError`](https://python-all.ru/3.3/library/exceptions.html#ValueError).225226#### `decode(s)`227228Возвращает представление *s* в Python (экземпляр [`str`](https://python-all.ru/3.3/library/stdtypes.html#str), содержащий JSON-документ)229230#### `raw_decode(s)`231232Декодирует JSON-документ из *s* (экземпляр [`str`](https://python-all.ru/3.3/library/stdtypes.html#str), начинающийся с JSON-документа) и возвращает кортеж из двух элементов: представление Python и индекс в *s*, на котором документ заканчивается.233234Это можно использовать для декодирования JSON-документа из строки, в конце которой могут быть лишние данные.235236#### `class json.JSONEncoder(skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None)`237238Расширяемый JSON-кодировщик для структур данных Python.239240По умолчанию поддерживает следующие объекты и типы:241242| Python | JSON |243| --- | --- |244| dict | объект |245| list, tuple | массив |246| str | строка |247| int, float | число |248| True | истина |249| False | ложь |250| None | null |251252Чтобы расширить это для распознавания других объектов, создайте подкласс и реализуйте метод [`default()`](https://python-all.ru/3.3/library/json.html#json.JSONEncoder.default): с помощью другого метода он должен возвращать сериализуемый объект для `o`, если это возможно; в противном случае следует вызвать реализацию суперкласса (чтобы возбудить [`TypeError`](https://python-all.ru/3.3/library/exceptions.html#TypeError)).253254Если *skipkeys* равен `False` (значение по умолчанию), то попытка кодирования ключей, не являющихся str, int, float или None, приводит к [`TypeError`](https://python-all.ru/3.3/library/exceptions.html#TypeError). Если *skipkeys* равен `True`, такие элементы просто пропускаются.255256Если *ensure\_ascii* равен `True` (по умолчанию), то гарантируется, что все входящие не-ASCII символы будут экранированы. Если *ensure\_ascii* равен `False`, эти символы будут выводиться как есть.257258Если *check\_circular* равен `True` (по умолчанию), то списки, словари и пользовательские кодированные объекты будут проверяться на циклические ссылки во время кодирования, чтобы предотвратить бесконечную рекурсию (которая привела бы к [`OverflowError`](https://python-all.ru/3.3/library/exceptions.html#OverflowError)). В противном случае такая проверка не производится.259260Если *allow\_nan* равен `True` (по умолчанию), то `NaN`, `Infinity` и `-Infinity` будут кодироваться как есть. Это поведение не соответствует спецификации JSON, но согласовано с большинством кодировщиков и декодировщиков на JavaScript. В противном случае кодирование таких чисел с плавающей точкой приведёт к [`ValueError`](https://python-all.ru/3.3/library/exceptions.html#ValueError).261262Если *sort\_keys* равен `True` (по умолчанию `False`), то вывод словарей будет отсортирован по ключам; это полезно для регрессионного тестирования, чтобы гарантировать, что JSON-сериализации можно сравнивать изо дня в день.263264Если *indent* – неотрицательное целое число или строка, то элементы массива JSON и члены объекта будут выводиться с отступами на указанный уровень. Уровень отступа 0, отрицательный или `""` приведёт только к вставке новых строк. `None` (по умолчанию) выбирает наиболее компактное представление. Использование положительного целого числа задаёт отступ в указанное количество пробелов на уровень. Если *indent* – строка (например, `"\t"`), то эта строка используется для отступа на каждом уровне.265266Изменено в версии 3.2: Разрешено использование строк для *indent* в дополнение к целым числам.267268> **Примечание**269>270> Поскольку разделителем элементов по умолчанию является `', '`, в выводе может появиться конечный пробел, если указан параметр *indent*. Чтобы этого избежать, можно использовать `separators=(',', ': ')`.271272Если указано, *separators* должны быть кортежем вида `(item_separator, key_separator)`. По умолчанию – `(', ', ': ')`. Чтобы получить наиболее компактное представление JSON, укажите `(',', ':')`, чтобы убрать пробелы.273274Если указан, *default* – это функция, которая вызывается для объектов, которые иначе не могут быть сериализованы. Она должна возвращать версию объекта, пригодную для кодирования в JSON, или возбуждать [`TypeError`](https://python-all.ru/3.3/library/exceptions.html#TypeError).275276#### `default(o)`277278Реализуйте этот метод в подклассе так, чтобы он возвращал сериализуемый объект для *o* или вызывал базовую реализацию (чтобы возбудить [`TypeError`](https://python-all.ru/3.3/library/exceptions.html#TypeError)).279280Например, чтобы поддерживать произвольные итераторы, можно реализовать default следующим образом:281282```python283def default(self, o):284 try:285 iterable = iter(o)286 except TypeError:287 pass288 else:289 return list(iterable)290 # Пусть метод базового класса по умолчанию возбуждает TypeError291 return json.JSONEncoder.default(self, o)292```293294#### `encode(o)`295296Возвращает строковое представление структуры данных Python в формате JSON, *o*. Например:297298```python299>>> json.JSONEncoder().encode({"foo": ["bar", "baz"]})300'{"foo": ["bar", "baz"]}'301```302303#### `iterencode(o)`304305Кодирует заданный объект *o* и выдаёт каждое строковое представление по мере готовности. Например:306307```python308for chunk in json.JSONEncoder().iterencode(bigobject):309 mysocket.write(chunk)310```311312## 19.2.3. Соответствие стандарту313314Формат JSON определён спецификацией [**RFC 4627**](https://python-all.ru/3.3/library/json.html). В этом разделе описывается степень соответствия модуля требованиям RFC. Для простоты подклассы [`JSONEncoder`](https://python-all.ru/3.3/library/json.html#json.JSONEncoder) и [`JSONDecoder`](https://python-all.ru/3.3/library/json.html#json.JSONDecoder), а также параметры, не указанные явно, не рассматриваются.315316Этот модуль не полностью соответствует RFC, реализуя некоторые расширения, которые являются допустимым JavaScript, но недопустимым JSON. В частности:317318- Принимаются и выводятся значения верхнего уровня, не являющиеся объектами или массивами;319- Бесконечные и NaN числовые значения принимаются и выводятся;320- Повторяющиеся имена в объекте принимаются, и используется только значение последней пары.321322Поскольку RFC разрешает совместимым с RFC анализаторам принимать входные тексты, которые не соответствуют RFC, десериализатор этого модуля технически соответствует RFC при настройках по умолчанию.323324### 19.2.3.1. Кодировки символов325326RFC рекомендует представлять JSON в кодировках UTF-8, UTF-16 или UTF-32, причём UTF-8 используется по умолчанию.327328Согласно RFC это допускается, но не требуется; сериализатор данного модуля по умолчанию использует *ensure\_ascii=True*, экранируя вывод так, чтобы результирующие строки содержали только ASCII-символы.329330За исключением параметра *ensure\_ascii*, данный модуль строго определён в терминах преобразования между объектами Python и [`Unicode strings`](https://python-all.ru/3.3/library/stdtypes.html#str), поэтому иным образом не затрагивает вопрос кодировок символов.331332### 19.2.3.2. Значения верхнего уровня, не являющиеся объектами или массивами333334RFC определяет, что значение верхнего уровня JSON-текста должно быть либо объектом JSON, либо массивом (Python [`dict`](https://python-all.ru/3.3/library/stdtypes.html#dict) или [`list`](https://python-all.ru/3.3/library/stdtypes.html#list)). Десериализатор этого модуля также принимает входные тексты, состоящие только из значения JSON null, boolean, number или string:335336```python337>>> just_a_json_string = '"spam and eggs"' # Сам по себе не является корректным текстом JSON338>>> json.loads(just_a_json_string)339'spam and eggs'340```341342Сам модуль не предоставляет способа считать такие входные тексты недопустимыми. Аналогично, сериализатор модуля также принимает в качестве входных данных отдельные значения Python [`None`](https://python-all.ru/3.3/library/constants.html#None), [`bool`](https://python-all.ru/3.3/library/functions.html#bool), числовые и [`str`](https://python-all.ru/3.3/library/stdtypes.html#str) и генерирует выходные тексты, состоящие только из значения JSON верхнего уровня null, boolean, number или string, без возбуждения исключения:343344```python345>>> neither_a_list_nor_a_dict = "spam and eggs"346>>> json.dumps(neither_a_list_nor_a_dict) # Результат не является корректным текстом JSON347'"spam and eggs"'348```349350Сериализатор этого модуля сам по себе не включает средства принудительного соблюдения упомянутого ограничения.351352### 19.2.3.3. Бесконечные и NaN-значения чисел353354RFC не допускает представление бесконечных или NaN числовых значений. Несмотря на это, по умолчанию данный модуль принимает и выводит `Infinity`, `-Infinity` и `NaN` так, как если бы они были допустимыми JSON-литералами чисел:355356```python357>>> # Ни один из этих вызовов не возбуждает исключение, но результаты не являются корректным JSON358>>> json.dumps(float('-inf'))359'-Infinity'360>>> json.dumps(float('nan'))361'NaN'362>>> # То же самое при десериализации363>>> json.loads('-Infinity')364-inf365>>> json.loads('NaN')366nan367```368369В сериализаторе параметр *allow\_nan* можно использовать для изменения этого поведения. В десериализаторе параметр *parse\_constant* можно использовать для изменения этого поведения.370371### 19.2.3.4. Повторяющиеся имена внутри объекта372373RFC определяет, что имена внутри объекта JSON должны быть уникальными, но не указывает, как следует обрабатывать повторяющиеся имена. По умолчанию модуль не возбуждает исключение; вместо этого он игнорирует все пары «имя-значение», кроме последней для данного имени:374375```python376>>> weird_json = '{"x": 1, "x": 2, "x": 3}'377>>> json.loads(weird_json)378{'x': 3}379```380381Параметр *object\_pairs\_hook* можно использовать для изменения этого поведения.382