Документация Python неофициальный перевод

json.md

380 строк · 34.6 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.2/library/json.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 18.2. [`json`](https://python-all.ru/3.2/library/json.html#module-json) – кодировщик и декодировщик JSON89[JSON (JavaScript Object Notation)](https://python-all.ru/3.2/library/json.html), определённый в [**RFC 4627**](https://python-all.ru/3.2/library/json.html), это легковесный формат обмена данными, основанный на подмножестве синтаксиса [JavaScript](https://python-all.ru/3.2/library/json.html) ([ECMA-262, 3-е издание](https://python-all.ru/3.2/library/json.html)).1011[`json`](https://python-all.ru/3.2/library/json.html#module-json) предоставляет API, знакомый пользователям модулей [`marshal`](https://python-all.ru/3.2/library/marshal.html#module-marshal) и [`pickle`](https://python-all.ru/3.2/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.2/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.2/library/json.html) 1.2. JSON, создаваемый настройками модуля по умолчанию (в частности, значением *separators* по умолчанию), также является подмножеством YAML 1.0 и 1.1. Таким образом, этот модуль можно использовать как сериализатор YAML.118119## 18.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.2/glossary.html#term-file-like-object)).124125Если *skipkeys* равно `True` (по умолчанию: `False`), то ключи словаря, не являющиеся базовыми типами ([`str`](https://python-all.ru/3.2/library/functions.html#str), [`int`](https://python-all.ru/3.2/library/functions.html#int), [`float`](https://python-all.ru/3.2/library/functions.html#float), [`bool`](https://python-all.ru/3.2/library/functions.html#bool), `None`), будут пропущены вместо возбуждения исключения [`TypeError`](https://python-all.ru/3.2/library/exceptions.html#TypeError).126127Модуль [`json`](https://python-all.ru/3.2/library/json.html#module-json) всегда создает объекты [`str`](https://python-all.ru/3.2/library/functions.html#str), а не [`bytes`](https://python-all.ru/3.2/library/functions.html#bytes). Поэтому `fp.write()` должен поддерживать ввод [`str`](https://python-all.ru/3.2/library/functions.html#str).128129Если *ensure\_ascii* равен `True` (по умолчанию), то гарантируется, что все входящие не-ASCII символы будут экранированы. Если *ensure\_ascii* равен `False`, эти символы будут выводиться как есть.130131Если *check\_circular* равно `False` (по умолчанию: `True`), то проверка циклических ссылок для контейнерных типов будет пропущена, и циклическая ссылка приведет к [`OverflowError`](https://python-all.ru/3.2/library/exceptions.html#OverflowError) (или хуже).132133Если *allow\_nan* равно `False` (по умолчанию: `True`), то сериализация значений [`float`](https://python-all.ru/3.2/library/functions.html#float) вне допустимого диапазона (`nan`, `inf`, `-inf`) будет вызывать [`ValueError`](https://python-all.ru/3.2/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.2/library/exceptions.html#TypeError). По умолчанию просто возбуждается [`TypeError`](https://python-all.ru/3.2/library/exceptions.html#TypeError).146147Если *sort\_keys* равно `True` (по умолчанию: `False`), то вывод словарей будет отсортирован по ключам.148149Чтобы использовать пользовательский подкласс [`JSONEncoder`](https://python-all.ru/3.2/library/json.html#json.JSONEncoder) (например, переопределяющий метод `default()` для сериализации дополнительных типов), укажите его в аргументе *cls*; в противном случае используется [`JSONEncoder`](https://python-all.ru/3.2/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.2/library/functions.html#str) в формате JSON. Аргументы имеют тот же смысл, что и в [`dump()`](https://python-all.ru/3.2/library/json.html#json.dump).154155> **Примечание**156>157> В отличие от [`pickle`](https://python-all.ru/3.2/library/pickle.html#module-pickle) и [`marshal`](https://python-all.ru/3.2/library/marshal.html#module-marshal), JSON не является протоколом с обрамлением, поэтому попытка сериализовать несколько объектов с помощью повторных вызовов [`dump()`](https://python-all.ru/3.2/library/json.html#json.dump) с одним и тем же *fp* приведет к созданию недопустимого JSON-файла.158159> **Примечание**160>161> Ключи в парах ключ-значение JSON всегда имеют тип [`str`](https://python-all.ru/3.2/library/functions.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* ([*файлоподобный объект*](https://python-all.ru/3.2/glossary.html#term-file-like-object), поддерживающий `.read()` и содержащий JSON-документ) в объект Python.166167*object\_hook* – необязательная функция, которая будет вызвана с результатом декодирования любого объектного литерала (словаря [`dict`](https://python-all.ru/3.2/library/stdtypes.html#dict)). Возвращаемое значение *object\_hook* будет использовано вместо [`dict`](https://python-all.ru/3.2/library/stdtypes.html#dict). Эта возможность может использоваться для реализации собственных декодеров (например, [JSON-RPC](https://python-all.ru/3.2/library/json.html) class hinting).168169*object\_pairs\_hook* – необязательная функция, которая будет вызвана с результатом декодирования любого объектного литерала в виде упорядоченного списка пар. Возвращаемое значение *object\_pairs\_hook* будет использовано вместо [`dict`](https://python-all.ru/3.2/library/stdtypes.html#dict). Эта возможность может использоваться для реализации собственных декодеров, которые полагаются на порядок декодирования пар ключ-значение (например, [`collections.OrderedDict()`](https://python-all.ru/3.2/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.2/library/decimal.html#decimal.Decimal)).174175*parse\_int*, если указан, будет вызван со строкой каждого декодируемого JSON-целого числа. По умолчанию это эквивалентно `int(num_str)`. Это можно использовать для применения другого типа данных или парсера для JSON целых чисел (например, [`float`](https://python-all.ru/3.2/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.2/library/json.html#json.JSONDecoder), укажите его в аргументе `cls`; в противном случае используется [`JSONDecoder`](https://python-all.ru/3.2/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.2/library/functions.html#str), содержащий JSON-документ) в объект Python.186187Остальные аргументы имеют тот же смысл, что и в [`load()`](https://python-all.ru/3.2/library/json.html#json.load), за исключением *encoding*, который игнорируется и является устаревшим.188189## 18.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.2/library/stdtypes.html#dict). Это может быть использовано для предоставления пользовательских десериализаций (например, для поддержки JSON-RPC подсказок классов).211212*object\_pairs\_hook*, если указан, будет вызван с результатом декодирования каждого JSON-объекта, представленным в виде упорядоченного списка пар. Возвращаемое значение *object\_pairs\_hook* будет использовано вместо [`dict`](https://python-all.ru/3.2/library/stdtypes.html#dict). Эта возможность может быть использована для реализации пользовательских декодеров, которые полагаются на порядок декодирования пар ключ-значение (например, [`collections.OrderedDict()`](https://python-all.ru/3.2/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.2/library/decimal.html#decimal.Decimal)).217218*parse\_int*, если указан, будет вызван со строкой каждого декодируемого JSON-целого числа. По умолчанию это эквивалентно `int(num_str)`. Это можно использовать для применения другого типа данных или парсера для JSON целых чисел (например, [`float`](https://python-all.ru/3.2/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#### `decode(s)`225226Возвращает представление *s* в Python (экземпляр [`str`](https://python-all.ru/3.2/library/functions.html#str), содержащий JSON-документ)227228#### `raw_decode(s)`229230Декодирует JSON-документ из *s* (экземпляр [`str`](https://python-all.ru/3.2/library/functions.html#str), начинающийся с JSON-документа) и возвращает кортеж из двух элементов: представление Python и индекс в *s*, на котором документ заканчивается.231232Это можно использовать для декодирования JSON-документа из строки, в конце которой могут быть лишние данные.233234#### `class json.JSONEncoder(skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None)`235236Расширяемый JSON-кодировщик для структур данных Python.237238По умолчанию поддерживает следующие объекты и типы:239240| Python | JSON |241| --- | --- |242| dict | объект |243| list, tuple | массив |244| str | строка |245| int, float | число |246| True | истина |247| False | ложь |248| None | null |249250Чтобы расширить это для распознавания других объектов, создайте подкласс и реализуйте метод [`default()`](https://python-all.ru/3.2/library/json.html#json.JSONEncoder.default): с помощью другого метода он должен возвращать сериализуемый объект для `o`, если это возможно; в противном случае следует вызвать реализацию суперкласса (чтобы возбудить [`TypeError`](https://python-all.ru/3.2/library/exceptions.html#TypeError)).251252Если *skipkeys* равен `False` (значение по умолчанию), то попытка кодирования ключей, не являющихся str, int, float или None, приводит к [`TypeError`](https://python-all.ru/3.2/library/exceptions.html#TypeError). Если *skipkeys* равен `True`, такие элементы просто пропускаются.253254Если *ensure\_ascii* равен `True` (по умолчанию), то гарантируется, что все входящие не-ASCII символы будут экранированы. Если *ensure\_ascii* равен `False`, эти символы будут выводиться как есть.255256Если *check\_circular* равен `True` (по умолчанию), то списки, словари и пользовательские кодированные объекты будут проверяться на циклические ссылки во время кодирования, чтобы предотвратить бесконечную рекурсию (которая привела бы к [`OverflowError`](https://python-all.ru/3.2/library/exceptions.html#OverflowError)). В противном случае такая проверка не производится.257258Если *allow\_nan* равен `True` (по умолчанию), то `NaN`, `Infinity` и `-Infinity` будут кодироваться как есть. Это поведение не соответствует спецификации JSON, но согласовано с большинством кодировщиков и декодировщиков на JavaScript. В противном случае кодирование таких чисел с плавающей точкой приведёт к [`ValueError`](https://python-all.ru/3.2/library/exceptions.html#ValueError).259260Если *sort\_keys* равен `True` (по умолчанию `False`), то вывод словарей будет отсортирован по ключам; это полезно для регрессионного тестирования, чтобы гарантировать, что JSON-сериализации можно сравнивать изо дня в день.261262Если *indent* – неотрицательное целое число или строка, то элементы массива JSON и члены объекта будут выводиться с отступами на указанный уровень. Уровень отступа 0, отрицательный или `""` приведёт только к вставке новых строк. `None` (по умолчанию) выбирает наиболее компактное представление. Использование положительного целого числа задаёт отступ в указанное количество пробелов на уровень. Если *indent* – строка (например, `"\t"`), то эта строка используется для отступа на каждом уровне.263264Изменено в версии 3.2: Теперь в качестве *indent* можно передавать строки, а не только целые числа.265266> **Примечание**267>268> Поскольку разделителем элементов по умолчанию является `', '`, в выводе может появиться конечный пробел, если указан параметр *indent*. Чтобы этого избежать, можно использовать `separators=(',', ': ')`.269270Если указано, *separators* должны быть кортежем вида `(item_separator, key_separator)`. По умолчанию – `(', ', ': ')`. Чтобы получить наиболее компактное представление JSON, укажите `(',', ':')`, чтобы убрать пробелы.271272Если указан, *default* – это функция, которая вызывается для объектов, которые иначе не могут быть сериализованы. Она должна возвращать версию объекта, пригодную для кодирования в JSON, или возбуждать [`TypeError`](https://python-all.ru/3.2/library/exceptions.html#TypeError).273274#### `default(o)`275276Реализуйте этот метод в подклассе так, чтобы он возвращал сериализуемый объект для *o* или вызывал базовую реализацию (чтобы возбудить [`TypeError`](https://python-all.ru/3.2/library/exceptions.html#TypeError)).277278Например, чтобы поддерживать произвольные итераторы, можно реализовать default следующим образом:279280```python281def default(self, o):282   try:283       iterable = iter(o)284   except TypeError:285       pass286   else:287       return list(iterable)288   # Пусть метод базового класса по умолчанию возбуждает TypeError289   return json.JSONEncoder.default(self, o)290```291292#### `encode(o)`293294Возвращает строковое представление структуры данных Python в формате JSON, *o*. Например:295296```python297>>> json.JSONEncoder().encode({"foo": ["bar", "baz"]})298'{"foo": ["bar", "baz"]}'299```300301#### `iterencode(o)`302303Кодирует заданный объект *o* и выдаёт каждое строковое представление по мере готовности. Например:304305```python306for chunk in json.JSONEncoder().iterencode(bigobject):307    mysocket.write(chunk)308```309310## 18.2.3. Соответствие стандартам311312Формат JSON определён спецификацией [**RFC 4627**](https://python-all.ru/3.2/library/json.html). В этом разделе описывается степень соответствия модуля требованиям RFC. Для простоты подклассы [`JSONEncoder`](https://python-all.ru/3.2/library/json.html#json.JSONEncoder) и [`JSONDecoder`](https://python-all.ru/3.2/library/json.html#json.JSONDecoder), а также параметры, не указанные явно, не рассматриваются.313314Этот модуль не полностью соответствует RFC, реализуя некоторые расширения, которые являются допустимым JavaScript, но недопустимым JSON. В частности:315316- Принимаются и выводятся значения верхнего уровня, не являющиеся объектами или массивами;317- Бесконечные и NaN числовые значения принимаются и выводятся;318- Повторяющиеся имена в объекте принимаются, и используется только значение последней пары.319320Поскольку RFC разрешает совместимым с RFC анализаторам принимать входные тексты, которые не соответствуют RFC, десериализатор этого модуля технически соответствует RFC при настройках по умолчанию.321322### 18.2.3.1. Кодировки символов323324RFC рекомендует представлять JSON в кодировках UTF-8, UTF-16 или UTF-32, причём UTF-8 используется по умолчанию.325326Согласно RFC это допускается, но не требуется; сериализатор данного модуля по умолчанию использует *ensure\_ascii=True*, экранируя вывод так, чтобы результирующие строки содержали только ASCII-символы.327328За исключением параметра *ensure\_ascii*, данный модуль строго определён в терминах преобразования между объектами Python и [`Unicode strings`](https://python-all.ru/3.2/library/functions.html#str), поэтому иным образом не затрагивает вопрос кодировок символов.329330### 18.2.3.2. Значения верхнего уровня, не являющиеся объектами или массивами331332RFC определяет, что значение верхнего уровня JSON-текста должно быть либо объектом JSON, либо массивом (Python [`dict`](https://python-all.ru/3.2/library/stdtypes.html#dict) или [`list`](https://python-all.ru/3.2/library/functions.html#list)). Десериализатор этого модуля также принимает входные тексты, состоящие только из значения JSON null, boolean, number или string:333334```python335>>> just_a_json_string = '"spam and eggs"'  # Сам по себе не является корректным текстом JSON336>>> json.loads(just_a_json_string)337'spam and eggs'338```339340Сам модуль не предоставляет способа считать такие входные тексты недопустимыми. Аналогично, сериализатор модуля также принимает в качестве входных данных отдельные значения Python [`None`](https://python-all.ru/3.2/library/constants.html#None), [`bool`](https://python-all.ru/3.2/library/functions.html#bool), числовые и [`str`](https://python-all.ru/3.2/library/functions.html#str) и генерирует выходные тексты, состоящие только из значения JSON верхнего уровня null, boolean, number или string, без возбуждения исключения:341342```python343>>> neither_a_list_nor_a_dict = "spam and eggs"344>>> json.dumps(neither_a_list_nor_a_dict)  # Результат не является корректным текстом JSON345'"spam and eggs"'346```347348Сериализатор этого модуля сам по себе не включает средства принудительного соблюдения упомянутого ограничения.349350### 18.2.3.3. Бесконечные и NaN-значения чисел351352RFC не допускает представление бесконечных или NaN числовых значений. Несмотря на это, по умолчанию данный модуль принимает и выводит `Infinity`, `-Infinity` и `NaN` так, как если бы они были допустимыми JSON-литералами чисел:353354```python355>>> # Ни один из этих вызовов не возбуждает исключение, но результаты не являются корректным JSON356>>> json.dumps(float('-inf'))357'-Infinity'358>>> json.dumps(float('nan'))359'NaN'360>>> # То же самое при десериализации361>>> json.loads('-Infinity')362-inf363>>> json.loads('NaN')364nan365```366367В сериализаторе параметр *allow\_nan* можно использовать для изменения этого поведения. В десериализаторе параметр *parse\_constant* можно использовать для изменения этого поведения.368369### 18.2.3.4. Повторяющиеся имена внутри объекта370371RFC определяет, что имена внутри объекта JSON должны быть уникальными, но не указывает, как следует обрабатывать повторяющиеся имена. По умолчанию модуль не возбуждает исключение; вместо этого он игнорирует все пары «имя-значение», кроме последней для данного имени:372373```python374>>> weird_json = '{"x": 1, "x": 2, "x": 3}'375>>> json.loads(weird_json)376{'x': 3}377```378379Параметр *object\_pairs\_hook* можно использовать для изменения этого поведения.380