json.md
1> **Источник:** https://python-all.ru/3.4/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.4/library/json.html#module-json) – кодировщик и декодировщик JSON89[JSON (JavaScript Object Notation)](https://python-all.ru/3.4/library/json.html), описанный в [**RFC 7159**](https://python-all.ru/3.4/library/json.html) (который заменяет [**RFC 4627**](https://python-all.ru/3.4/library/json.html)) и в [ECMA-404](https://python-all.ru/3.4/library/json.html), является легковесным форматом обмена данными, вдохновлённым синтаксисом литералов объектов [JavaScript](https://python-all.ru/3.4/library/json.html) (хотя он не является строгим подмножеством JavaScript [\[1\]](https://python-all.ru/3.4/library/json.html#rfc-errata)).1011[`json`](https://python-all.ru/3.4/library/json.html#module-json) предоставляет API, знакомый пользователям модулей [`marshal`](https://python-all.ru/3.4/library/marshal.html#module-marshal) и [`pickle`](https://python-all.ru/3.4/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, indent=4))47{48 "4": 5,49 "6": 750}51```5253Декодирование JSON:5455```python56>>> import json57>>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')58['foo', {'bar': ['baz', None, 1.0, 2]}]59>>> json.loads('"\\"foo\\bar"')60'"foo\x08ar'61>>> from io import StringIO62>>> io = StringIO('["streaming API"]')63>>> json.load(io)64['streaming API']65```6667Специализированное декодирование объектов JSON:6869```python70>>> import json71>>> def as_complex(dct):72... if '__complex__' in dct:73... return complex(dct['real'], dct['imag'])74... return dct75...76>>> json.loads('{"__complex__": true, "real": 1, "imag": 2}',77... object_hook=as_complex)78(1+2j)79>>> import decimal80>>> json.loads('1.1', parse_float=decimal.Decimal)81Decimal('1.1')82```8384Расширение [`JSONEncoder`](https://python-all.ru/3.4/library/json.html#json.JSONEncoder):8586```python87>>> import json88>>> class ComplexEncoder(json.JSONEncoder):89... def default(self, obj):90... if isinstance(obj, complex):91... return [obj.real, obj.imag]92... # Пусть метод базового класса по умолчанию возбуждает TypeError93... return json.JSONEncoder.default(self, obj)94...95>>> json.dumps(2 + 1j, cls=ComplexEncoder)96'[2.0, 1.0]'97>>> ComplexEncoder().encode(2 + 1j)98'[2.0, 1.0]'99>>> list(ComplexEncoder().iterencode(2 + 1j))100['[2.0', ', 1.0', ']']101```102103Использование json.tool из командной оболочки для проверки и форматирования:104105```bash106$ echo '{"json":"obj"}' | python -m json.tool107{108 "json": "obj"109}110$ echo '{1.2:3.4}' | python -m json.tool111Expecting property name enclosed in double quotes: line 1 column 2 (char 1)112```113114> **Примечание**115>116> JSON является подмножеством [YAML](https://python-all.ru/3.4/library/json.html) 1.2. JSON, создаваемый настройками модуля по умолчанию (в частности, значением *separators* по умолчанию), также является подмножеством YAML 1.0 и 1.1. Таким образом, этот модуль можно использовать как сериализатор YAML.117118## 19.2.1. Основное использование119120#### `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)`121122Сериализует *obj* в поток в формате JSON в *fp* (`.write()`-совместимый [*файлоподобный объект*](https://python-all.ru/3.4/glossary.html#term-file-like-object)) с помощью этой [*таблицы преобразования*](https://python-all.ru/3.4/library/json.html#py-to-json-table).123124Если *skipkeys* равно `True` (по умолчанию: `False`), то ключи словаря, не являющиеся базовыми типами ([`str`](https://python-all.ru/3.4/library/stdtypes.html#str), [`int`](https://python-all.ru/3.4/library/functions.html#int), [`float`](https://python-all.ru/3.4/library/functions.html#float), [`bool`](https://python-all.ru/3.4/library/functions.html#bool), `None`), будут пропущены вместо возбуждения исключения [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError).125126Модуль [`json`](https://python-all.ru/3.4/library/json.html#module-json) всегда создает объекты [`str`](https://python-all.ru/3.4/library/stdtypes.html#str), а не [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes). Поэтому `fp.write()` должен поддерживать ввод [`str`](https://python-all.ru/3.4/library/stdtypes.html#str).127128Если *ensure\_ascii* равно `True` (по умолчанию), то гарантируется, что все не-ASCII символы во входных данных будут экранированы. Если *ensure\_ascii* равно `False`, эти символы будут выводиться как есть.129130Если *check\_circular* равно `False` (по умолчанию: `True`), то проверка циклических ссылок для контейнерных типов будет пропущена, и циклическая ссылка приведет к [`OverflowError`](https://python-all.ru/3.4/library/exceptions.html#OverflowError) (или хуже).131132Если *allow\_nan* равно `False` (по умолчанию: `True`), то сериализация значений [`float`](https://python-all.ru/3.4/library/functions.html#float) вне допустимого диапазона (`nan`, `inf`, `-inf`) будет вызывать [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError) в строгом соответствии со спецификацией JSON, вместо использования JavaScript-эквивалентов (`NaN`, `Infinity`, `-Infinity`).133134Если *indent* – неотрицательное целое число или строка, то элементы массива JSON и члены объектов будут выводиться с отступами указанного уровня. Уровень отступа 0, отрицательное значение или `""` вставляет только символы новой строки. `None` (по умолчанию) выбирает наиболее компактное представление. Использование положительного целого числа в качестве отступа добавляет указанное количество пробелов на каждый уровень. Если *indent* – строка (например, `"\t"`), эта строка используется для отступа каждого уровня.135136Изменено в версии 3.2: Разрешено использование строк для *indent* в дополнение к целым числам.137138Если указан, *separators* должен быть кортежем `(item_separator, key_separator)`. По умолчанию используется `(', ', ': ')`, если *indent* равно `None`, и `(',', ': ')` в противном случае. Для получения наиболее компактного JSON-представления следует указать `(',', ':')`, чтобы исключить пробелы.139140Изменено в версии 3.4: Используется `(',', ': ')` по умолчанию, если *indent* не равно `None`.141142*default(obj)* – это функция, которая должна возвращать сериализуемую версию *obj* или возбуждать [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError). По умолчанию просто возбуждается [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError).143144Если *sort\_keys* равно `True` (по умолчанию: `False`), то вывод словарей будет отсортирован по ключам.145146Чтобы использовать пользовательский подкласс [`JSONEncoder`](https://python-all.ru/3.4/library/json.html#json.JSONEncoder) (например, переопределяющий метод `default()` для сериализации дополнительных типов), укажите его в аргументе *cls*; в противном случае используется [`JSONEncoder`](https://python-all.ru/3.4/library/json.html#json.JSONEncoder).147148#### `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)`149150Сериализует *obj* в [`str`](https://python-all.ru/3.4/library/stdtypes.html#str) в формате JSON с помощью этой [*таблицы преобразования*](https://python-all.ru/3.4/library/json.html#py-to-json-table). Аргументы имеют тот же смысл, что и в [`dump()`](https://python-all.ru/3.4/library/json.html#json.dump).151152> **Примечание**153>154> В отличие от [`pickle`](https://python-all.ru/3.4/library/pickle.html#module-pickle) и [`marshal`](https://python-all.ru/3.4/library/marshal.html#module-marshal), JSON не является протоколом с обрамлением, поэтому попытка сериализовать несколько объектов с помощью повторных вызовов [`dump()`](https://python-all.ru/3.4/library/json.html#json.dump) с одним и тем же *fp* приведет к созданию недопустимого JSON-файла.155156> **Примечание**157>158> Ключи в парах ключ-значение JSON всегда имеют тип [`str`](https://python-all.ru/3.4/library/stdtypes.html#str). Когда словарь преобразуется в JSON, все ключи словаря приводятся к строкам. В результате, если словарь преобразуется в JSON, а затем обратно в словарь, полученный словарь может не совпадать с исходным. То есть `loads(dumps(x)) != x`, если x содержит нестроковые ключи.159160#### `json.load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)`161162Десериализует *fp* (`.read()`-совместимый [*файлоподобный объект*](https://python-all.ru/3.4/glossary.html#term-file-like-object), содержащий JSON-документ) в объект Python с помощью этой [*таблицы преобразования*](https://python-all.ru/3.4/library/json.html#json-to-py-table).163164*object\_hook* – необязательная функция, которая будет вызвана с результатом декодирования любого объектного литерала (словаря [`dict`](https://python-all.ru/3.4/library/stdtypes.html#dict)). Возвращаемое значение *object\_hook* будет использовано вместо [`dict`](https://python-all.ru/3.4/library/stdtypes.html#dict). Эта возможность может использоваться для реализации собственных декодеров (например, [JSON-RPC](https://python-all.ru/3.4/library/json.html) class hinting).165166*object\_pairs\_hook* – необязательная функция, которая будет вызвана с результатом декодирования любого объектного литерала в виде упорядоченного списка пар. Возвращаемое значение *object\_pairs\_hook* будет использовано вместо [`dict`](https://python-all.ru/3.4/library/stdtypes.html#dict). Эта возможность может использоваться для реализации собственных декодеров, которые полагаются на порядок декодирования пар ключ-значение (например, [`collections.OrderedDict()`](https://python-all.ru/3.4/library/collections.html#collections.OrderedDict) запомнит порядок вставки). Если также определен *object\_hook*, *object\_pairs\_hook* имеет приоритет.167168Изменено в версии 3.1: Добавлена поддержка *object\_pairs\_hook*.169170*parse\_float*, если указан, будет вызываться со строкой каждого JSON-числа с плавающей точкой для декодирования. По умолчанию это эквивалентно вызову `float(num_str)`. Это можно использовать для применения другого типа данных или парсера для JSON-чисел с плавающей точкой (например, [`decimal.Decimal`](https://python-all.ru/3.4/library/decimal.html#decimal.Decimal)).171172*parse\_int*, если указан, будет вызываться со строкой каждого целого числа JSON для декодирования. По умолчанию это эквивалентно вызову `int(num_str)`. Это можно использовать для применения другого типа данных или парсера для целых чисел JSON (например, [`float`](https://python-all.ru/3.4/library/functions.html#float)).173174*parse\_constant*, если указан, будет вызываться с одной из следующих строк: `'-Infinity'`, `'Infinity'`, `'NaN'`. Это можно использовать для возбуждения исключения при обнаружении недопустимых чисел JSON.175176Изменено в версии 3.1: *parse\_constant* больше не вызывается для ‘null’, ‘true’, ‘false’.177178Чтобы использовать пользовательский подкласс [`JSONDecoder`](https://python-all.ru/3.4/library/json.html#json.JSONDecoder), укажите его в аргументе `cls`; в противном случае используется [`JSONDecoder`](https://python-all.ru/3.4/library/json.html#json.JSONDecoder). Дополнительные ключевые аргументы будут переданы конструктору класса.179180Если десериализуемые данные не являются допустимым JSON-документом, будет возбуждено [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError).181182#### `json.loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)`183184Десериализует *s* (экземпляр [`str`](https://python-all.ru/3.4/library/stdtypes.html#str), содержащий JSON-документ) в объект Python, используя данную [*таблицу преобразования*](https://python-all.ru/3.4/library/json.html#json-to-py-table).185186Остальные аргументы имеют тот же смысл, что и в [`load()`](https://python-all.ru/3.4/library/json.html#json.load), за исключением *encoding*, который игнорируется и является устаревшим.187188Если десериализуемые данные не являются корректным JSON-документом, будет возбуждено исключение [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError).189190## 19.2.2. Кодировщики и декодировщики191192#### `class json.JSONDecoder(object_hook=None, parse_float=None, parse_int=None, parse_constant=None, strict=True, object_pairs_hook=None)`193194Простой JSON-декодер.195196По умолчанию выполняет следующие преобразования при декодировании:197198| JSON | Python |199| --- | --- |200| объект | dict |201| массив | list |202| строка | str |203| число (int) | int |204| число (вещественное) | float |205| истина | True |206| ложь | False |207| null | None |208209Он также понимает `NaN`, `Infinity` и `-Infinity` как соответствующие значения `float`, что выходит за рамки спецификации JSON.210211*object\_hook*, если указан, будет вызван с результатом декодирования каждого JSON-объекта, и его возвращаемое значение будет использовано вместо переданного [`dict`](https://python-all.ru/3.4/library/stdtypes.html#dict). Это может быть использовано для предоставления пользовательских десериализаций (например, для поддержки JSON-RPC подсказок классов).212213*object\_pairs\_hook*, если указан, будет вызван с результатом декодирования каждого JSON-объекта, представленным в виде упорядоченного списка пар. Возвращаемое значение *object\_pairs\_hook* будет использовано вместо [`dict`](https://python-all.ru/3.4/library/stdtypes.html#dict). Эта возможность может быть использована для реализации пользовательских декодеров, которые полагаются на порядок декодирования пар ключ-значение (например, [`collections.OrderedDict()`](https://python-all.ru/3.4/library/collections.html#collections.OrderedDict) запомнит порядок вставки). Если *object\_hook* также определён, то *object\_pairs\_hook* имеет приоритет.214215Изменено в версии 3.1: Добавлена поддержка *object\_pairs\_hook*.216217*parse\_float*, если указан, будет вызван со строкой каждого декодируемого JSON-числа с плавающей точкой. По умолчанию это эквивалентно `float(num_str)`. Это можно использовать для применения другого типа данных или парсера для JSON чисел с плавающей точкой (например, [`decimal.Decimal`](https://python-all.ru/3.4/library/decimal.html#decimal.Decimal)).218219*parse\_int*, если указан, будет вызван со строкой каждого декодируемого JSON-целого числа. По умолчанию это эквивалентно `int(num_str)`. Это можно использовать для применения другого типа данных или парсера для JSON целых чисел (например, [`float`](https://python-all.ru/3.4/library/functions.html#float)).220221*parse\_constant*, если указан, будет вызван с одной из следующих строк: `'-Infinity'`, `'Infinity'`, `'NaN'`, `'null'`, `'true'`, `'false'`. Это может быть использовано для возбуждения исключения при обнаружении недопустимых JSON чисел.222223Если *strict* равен `False` (`True` – значение по умолчанию), то управляющие символы будут разрешены внутри строк. Управляющие символы в данном контексте – это символы с кодами в диапазоне 0–31, включая `'\t'` (табуляция), `'\n'` (новая строка), `'\r'` (возврат каретки) и `'\0'`.224225Если десериализуемые данные не являются корректным JSON-документом, будет возбуждено исключение [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError).226227#### `decode(s)`228229Возвращает представление Python для *s* (экземпляр [`str`](https://python-all.ru/3.4/library/stdtypes.html#str), содержащий JSON-документ).230231#### `raw_decode(s)`232233Декодирует JSON-документ из *s* (экземпляр [`str`](https://python-all.ru/3.4/library/stdtypes.html#str), начинающийся с JSON-документа) и возвращает кортеж из двух элементов: представление Python и индекс в *s*, на котором документ заканчивается.234235Это можно использовать для декодирования JSON-документа из строки, в конце которой могут быть лишние данные.236237#### `class json.JSONEncoder(skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None)`238239Расширяемый JSON-кодировщик для структур данных Python.240241По умолчанию поддерживает следующие объекты и типы:242243| Python | JSON |244| --- | --- |245| dict | объект |246| list, tuple | массив |247| str | строка |248| int, float, перечисления, производные от int и float | число |249| True | истина |250| False | ложь |251| None | null |252253Изменено в версии 3.4: Добавлена поддержка классов Enum, производных от int и float.254255Чтобы расширить это для распознавания других объектов, создайте подкласс и реализуйте метод [`default()`](https://python-all.ru/3.4/library/json.html#json.JSONEncoder.default): с помощью другого метода он должен возвращать сериализуемый объект для `o`, если это возможно; в противном случае следует вызвать реализацию суперкласса (чтобы возбудить [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError)).256257Если *skipkeys* равен `False` (значение по умолчанию), то попытка кодирования ключей, не являющихся str, int, float или None, приводит к [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError). Если *skipkeys* равен `True`, такие элементы просто пропускаются.258259Если *ensure\_ascii* равен `True` (по умолчанию), то гарантируется, что все входящие не-ASCII символы будут экранированы. Если *ensure\_ascii* равен `False`, эти символы будут выводиться как есть.260261Если *check\_circular* равен `True` (по умолчанию), то списки, словари и пользовательские кодированные объекты будут проверяться на циклические ссылки во время кодирования, чтобы предотвратить бесконечную рекурсию (которая привела бы к [`OverflowError`](https://python-all.ru/3.4/library/exceptions.html#OverflowError)). В противном случае такая проверка не производится.262263Если *allow\_nan* равен `True` (по умолчанию), то `NaN`, `Infinity` и `-Infinity` будут кодироваться как есть. Это поведение не соответствует спецификации JSON, но согласовано с большинством кодировщиков и декодировщиков на JavaScript. В противном случае кодирование таких чисел с плавающей точкой приведёт к [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError).264265Если *sort\_keys* равен `True` (по умолчанию `False`), то вывод словарей будет отсортирован по ключам; это полезно для регрессионного тестирования, чтобы гарантировать, что JSON-сериализации можно сравнивать изо дня в день.266267Если *indent* – неотрицательное целое число или строка, то элементы массива JSON и члены объекта будут выводиться с отступами на указанный уровень. Уровень отступа 0, отрицательный или `""` приведёт только к вставке новых строк. `None` (по умолчанию) выбирает наиболее компактное представление. Использование положительного целого числа задаёт отступ в указанное количество пробелов на уровень. Если *indent* – строка (например, `"\t"`), то эта строка используется для отступа на каждом уровне.268269Изменено в версии 3.2: Разрешено использование строк для *indent* в дополнение к целым числам.270271Если указано, *separators* должен быть кортежем `(item_separator, key_separator)`. Значение по умолчанию – `(', ', ': ')`, если *indent* равен `None`, и `(',', ': ')` в противном случае. Чтобы получить наиболее компактное представление JSON, следует указать `(',', ':')`, чтобы исключить пробельные символы.272273Изменено в версии 3.4: Используется `(',', ': ')` по умолчанию, если *indent* не равен `None`.274275Если указан, *default* – это функция, которая вызывается для объектов, которые иначе не могут быть сериализованы. Она должна возвращать версию объекта, пригодную для кодирования в JSON, или возбуждать [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError).276277#### `default(o)`278279Реализуйте этот метод в подклассе так, чтобы он возвращал сериализуемый объект для *o* или вызывал базовую реализацию (чтобы возбудить [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError)).280281Например, чтобы поддерживать произвольные итераторы, можно реализовать default следующим образом:282283```python284def default(self, o):285 try:286 iterable = iter(o)287 except TypeError:288 pass289 else:290 return list(iterable)291 # Пусть метод базового класса по умолчанию возбуждает TypeError292 return json.JSONEncoder.default(self, o)293```294295#### `encode(o)`296297Возвращает строковое представление структуры данных Python в формате JSON, *o*. Например:298299```python300>>> json.JSONEncoder().encode({"foo": ["bar", "baz"]})301'{"foo": ["bar", "baz"]}'302```303304#### `iterencode(o)`305306Кодирует заданный объект *o* и выдаёт каждое строковое представление по мере готовности. Например:307308```python309for chunk in json.JSONEncoder().iterencode(bigobject):310 mysocket.write(chunk)311```312313## 19.2.3. Соответствие стандарту и интероперабельность314315Формат JSON определён в [**RFC 7159**](https://python-all.ru/3.4/library/json.html) и в [ECMA-404](https://python-all.ru/3.4/library/json.html). В этом разделе описывается, насколько данный модуль соответствует RFC. Для простоты подклассы [`JSONEncoder`](https://python-all.ru/3.4/library/json.html#json.JSONEncoder) и [`JSONDecoder`](https://python-all.ru/3.4/library/json.html#json.JSONDecoder), а также параметры, не упомянутые явно, не рассматриваются.316317Этот модуль не полностью соответствует RFC, реализуя некоторые расширения, которые являются допустимым JavaScript, но недопустимым JSON. В частности:318319- Бесконечные и 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 строками`](https://python-all.ru/3.4/library/stdtypes.html#str), и поэтому напрямую не затрагивает проблему кодировок символов.331332RFC запрещает добавление маркера порядка байтов (BOM) в начало JSON-текста, и сериализатор данного модуля не добавляет BOM в свой вывод. RFC разрешает, но не требует, чтобы десериализаторы JSON игнорировали начальный BOM во входных данных. Десериализатор данного модуля возбуждает [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError), когда во входных данных присутствует начальный BOM.333334RFC явно не запрещает JSON-строки, содержащие последовательности байтов, не соответствующие допустимым символам Unicode (например, непарные суррогаты UTF-16), но отмечает, что они могут вызывать проблемы совместимости. По умолчанию данный модуль принимает и выводит (если они присутствуют в исходной строке [`str`](https://python-all.ru/3.4/library/stdtypes.html#str)) кодовые точки для таких последовательностей.335336### 19.2.3.2. Бесконечные и NaN числовые значения337338RFC не допускает представление бесконечных или NaN числовых значений. Несмотря на это, по умолчанию данный модуль принимает и выводит `Infinity`, `-Infinity` и `NaN` так, как если бы они были допустимыми JSON-литералами чисел:339340```python341>>> # Ни один из этих вызовов не возбуждает исключение, но результаты не являются корректным JSON342>>> json.dumps(float('-inf'))343'-Infinity'344>>> json.dumps(float('nan'))345'NaN'346>>> # То же самое при десериализации347>>> json.loads('-Infinity')348-inf349>>> json.loads('NaN')350nan351```352353В сериализаторе параметр *allow\_nan* можно использовать для изменения этого поведения. В десериализаторе параметр *parse\_constant* можно использовать для изменения этого поведения.354355### 19.2.3.3. Повторяющиеся имена внутри объекта356357RFC указывает, что имена внутри JSON-объекта должны быть уникальными, но не предписывает, как обрабатывать повторяющиеся имена в JSON-объектах. По умолчанию этот модуль не вызывает исключение; вместо этого он игнорирует все, кроме последней пары имя-значение для данного имени:358359```python360>>> weird_json = '{"x": 1, "x": 2, "x": 3}'361>>> json.loads(weird_json)362{'x': 3}363```364365Параметр *object\_pairs\_hook* можно использовать для изменения этого поведения.366367### 19.2.3.4. Верхнеуровневые необъектные и немассивные значения368369Старая версия JSON, определённая устаревшим [**RFC 4627**](https://python-all.ru/3.4/library/json.html), требовала, чтобы верхнеуровневое значение JSON-текста должно быть либо объектом JSON, либо массивом (в Python [`dict`](https://python-all.ru/3.4/library/stdtypes.html#dict) или [`list`](https://python-all.ru/3.4/library/stdtypes.html#list)), и не могло быть null, логическим значением, числом или строкой. [**RFC 7159**](https://python-all.ru/3.4/library/json.html) отменил это ограничение, и данный модуль не реализовывал это ограничение и никогда его не реализовывал ни в своём сериализаторе, ни в десериализаторе.370371Тем не менее, для максимальной совместимости можно добровольно придерживаться этого ограничения.372373### 19.2.3.5. Ограничения реализации374375Некоторые реализации JSON-десериализаторов могут устанавливать ограничения на:376377- размер принимаемых JSON-текстов378- максимальный уровень вложенности JSON-объектов и массивов379- диапазон и точность JSON-чисел380- содержимое и максимальную длину JSON-строк381382Этот модуль не накладывает никаких подобных ограничений, кроме тех, что присущи соответствующим типам данных Python или самому интерпретатору Python.383384При сериализации в JSON следует учитывать любые такие ограничения в приложениях, которые могут потреблять ваш JSON. В частности, числа JSON часто десериализуются в числа двойной точности IEEE 754 и поэтому подпадают под ограничения диапазона и точности этого представления. Это особенно актуально при сериализации значений Python [`int`](https://python-all.ru/3.4/library/functions.html#int) чрезвычайно большой величины или при сериализации экземпляров «экзотических» числовых типов, таких как [`decimal.Decimal`](https://python-all.ru/3.4/library/decimal.html#decimal.Decimal).385386Сноски387388| [\[1\]](https://python-all.ru/3.4/library/json.html#id1) | Как отмечено в [списке ошибок RFC 7159](https://python-all.ru/3.4/library/json.html), JSON допускает символы U+2028 (LINE SEPARATOR) и U+2029 (PARAGRAPH SEPARATOR) в строках, тогда как JavaScript (начиная с ECMAScript Edition 5.1) – нет. |389| --- | --- |390