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

json.md

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

1> **Источник:** https://python-all.ru/2.7/library/json.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 18.2. [`json`](https://python-all.ru/2.7/library/json.html#module-json) – кодировщик и декодировщик JSON89Новое в версии 2.6.1011[JSON (JavaScript Object Notation)](https://python-all.ru/2.7/library/json.html), описанный в [**RFC 7159**](https://python-all.ru/2.7/library/json.html) (который заменяет [**RFC 4627**](https://python-all.ru/2.7/library/json.html)) и в [ECMA-404](https://python-all.ru/2.7/library/json.html), является легковесным форматом обмена данными, вдохновлённым синтаксисом литералов объектов [JavaScript](https://python-all.ru/2.7/library/json.html) (хотя он не является строгим подмножеством JavaScript [1](https://python-all.ru/2.7/library/json.html#rfc-errata)).1213[`json`](https://python-all.ru/2.7/library/json.html#module-json) предоставляет API, знакомый пользователям модулей стандартной библиотеки [`marshal`](https://python-all.ru/2.7/library/marshal.html#module-marshal) и [`pickle`](https://python-all.ru/2.7/library/pickle.html#module-pickle).1415Кодирование иерархий базовых объектов Python:1617```python18>>> import json19>>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])20'["foo", {"bar": ["baz", null, 1.0, 2]}]'21>>> print json.dumps("\"foo\bar")22"\"foo\bar"23>>> print json.dumps(u'\u1234')24"\u1234"25>>> print json.dumps('\\')26"\\"27>>> print json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True)28{"a": 0, "b": 0, "c": 0}29>>> from StringIO import StringIO30>>> io = StringIO()31>>> json.dump(['streaming API'], io)32>>> io.getvalue()33'["streaming API"]'34```3536Компактное кодирование:3738```python39>>> import json40>>> json.dumps([1,2,3,{'4': 5, '6': 7}], separators=(',',':'))41'[1,2,3,{"4":5,"6":7}]'42```4344Красивое форматирование:4546```python47>>> import json48>>> print json.dumps({'4': 5, '6': 7}, sort_keys=True,49...                  indent=4, separators=(',', ': '))50{51    "4": 5,52    "6": 753}54```5556Декодирование JSON:5758```python59>>> import json60>>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')61[u'foo', {u'bar': [u'baz', None, 1.0, 2]}]62>>> json.loads('"\\"foo\\bar"')63u'"foo\x08ar'64>>> from StringIO import StringIO65>>> io = StringIO('["streaming API"]')66>>> json.load(io)67[u'streaming API']68```6970Специализированное декодирование объектов JSON:7172```python73>>> import json74>>> def as_complex(dct):75...     if '__complex__' in dct:76...         return complex(dct['real'], dct['imag'])77...     return dct78...79>>> json.loads('{"__complex__": true, "real": 1, "imag": 2}',80...     object_hook=as_complex)81(1+2j)82>>> import decimal83>>> json.loads('1.1', parse_float=decimal.Decimal)84Decimal('1.1')85```8687Расширение [`JSONEncoder`](https://python-all.ru/2.7/library/json.html#json.JSONEncoder):8889```python90>>> import json91>>> class ComplexEncoder(json.JSONEncoder):92...     def default(self, obj):93...         if isinstance(obj, complex):94...             return [obj.real, obj.imag]95...         # Пусть метод базового класса по умолчанию возбуждает TypeError96...         return json.JSONEncoder.default(self, obj)97...98>>> json.dumps(2 + 1j, cls=ComplexEncoder)99'[2.0, 1.0]'100>>> ComplexEncoder().encode(2 + 1j)101'[2.0, 1.0]'102>>> list(ComplexEncoder().iterencode(2 + 1j))103['[', '2.0', ', ', '1.0', ']']104```105106Использование `json.tool` из командной оболочки для проверки и красивого вывода:107108```text109$ echo '{"json":"obj"}' | python -m json.tool110{111    "json": "obj"112}113$ echo '{1.2:3.4}' | python -mjson.tool114Expecting property name enclosed in double quotes: line 1 column 2 (char 1)115```116117> **Примечание**118>119> JSON является подмножеством [YAML](https://python-all.ru/2.7/library/json.html) 1.2. JSON, создаваемый настройками модуля по умолчанию (в частности, значением *separators* по умолчанию), также является подмножеством YAML 1.0 и 1.1. Таким образом, этот модуль можно использовать как сериализатор YAML.120121## 18.2.1. Основное использование122123#### `json.dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)`124125Сериализует *obj* в поток в формате JSON в *fp* (с поддержкой `.write()` [объекта, похожего на файл](https://python-all.ru/2.7/glossary.html#term-file-like-object)) с помощью этой [таблицы преобразования](https://python-all.ru/2.7/library/json.html#py-to-json-table).126127Если *skipkeys* равен true (по умолчанию: `False`), то ключи словаря, которые не относятся к базовому типу ([`str`](https://python-all.ru/2.7/library/functions.html#str), [`unicode`](https://python-all.ru/2.7/library/functions.html#unicode), [`int`](https://python-all.ru/2.7/library/functions.html#int), [`long`](https://python-all.ru/2.7/library/functions.html#long), [`float`](https://python-all.ru/2.7/library/functions.html#float), [`bool`](https://python-all.ru/2.7/library/functions.html#bool), `None`), будут пропущены вместо возбуждения [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError).128129Если *ensure\_ascii* равен true (по умолчанию), то все не-ASCII символы в выводе экранируются последовательностями `\uXXXX`, и результатом является экземпляр [`str`](https://python-all.ru/2.7/library/functions.html#str), состоящий только из символов ASCII. Если *ensure\_ascii* равен false, некоторые блоки, записанные в *fp*, могут быть экземплярами [`unicode`](https://python-all.ru/2.7/library/functions.html#unicode). Обычно это происходит из-за того, что входные данные содержат строки unicode или используется параметр *encoding*. Если только `fp.write()` явно не понимает [`unicode`](https://python-all.ru/2.7/library/functions.html#unicode) (как в [`codecs.getwriter()`](https://python-all.ru/2.7/library/codecs.html#codecs.getwriter)), это, скорее всего, вызовет ошибку.130131Если *check\_circular* равен false (по умолчанию: `True`), то проверка циклических ссылок для контейнерных типов будет пропущена, и циклическая ссылка приведёт к [`OverflowError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.OverflowError) (или хуже).132133Если *allow\_nan* имеет значение false (по умолчанию `True`), то будет [`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError) сериализовать значения [`float`](https://python-all.ru/2.7/library/functions.html#float), выходящие за пределы (`nan`, `inf`, `-inf`), в строгом соответствии со спецификацией JSON. Если *allow\_nan* имеет значение true, будут использоваться их эквиваленты из JavaScript (`NaN`, `Infinity`, `-Infinity`).134135Если *indent* – неотрицательное целое число, то элементы массива JSON и члены объекта будут красиво отформатированы с этим уровнем отступа. Уровень отступа 0 или отрицательное значение вставляет только новые строки. `None` (по умолчанию) выбирает наиболее компактное представление.136137> **Примечание**138>139> Поскольку разделитель элементов по умолчанию – `', '`, вывод может содержать завершающие пробелы, когда указан *indent*. Чтобы избежать этого, можно использовать `separators=(',', ': ')`.140141Если указан, *separators* должен быть кортежем `(item_separator, key_separator)`. По умолчанию используются `(', ', ': ')`. Чтобы получить наиболее компактное представление JSON, следует указать `(',', ':')` для устранения пробелов.142143*encoding* – это кодировка символов для экземпляров str, по умолчанию UTF-8.144145Если указан, *default* должен быть функцией, которая вызывается для объектов, которые не могут быть сериализованы иным способом. Она должна возвращать версию объекта, пригодную для JSON-кодирования, или возбуждать [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError). Если не указано, возбуждается [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError).146147Если *sort\_keys* имеет значение true (по умолчанию `False`), то вывод словарей будет отсортирован по ключам.148149Чтобы использовать пользовательский подкласс [`JSONEncoder`](https://python-all.ru/2.7/library/json.html#json.JSONEncoder) (например, переопределяющий метод `default()` для сериализации дополнительных типов), укажите его с помощью именованного аргумента *cls*; в противном случае используется [`JSONEncoder`](https://python-all.ru/2.7/library/json.html#json.JSONEncoder).150151> **Примечание**152>153> В отличие от [`pickle`](https://python-all.ru/2.7/library/pickle.html#module-pickle) и [`marshal`](https://python-all.ru/2.7/library/marshal.html#module-marshal), JSON не является фреймовым протоколом, поэтому попытка сериализовать больше объектов с повторными вызовами [`dump()`](https://python-all.ru/2.7/library/json.html#json.dump) и одного и того же *fp* приведёт к созданию невалидного JSON-файла.154155#### `json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)`156157Сериализует *obj* в [`str`](https://python-all.ru/2.7/library/functions.html#str) в формате JSON, используя [таблицу преобразования](https://python-all.ru/2.7/library/json.html#py-to-json-table). Если *ensure\_ascii* равен false, результат может содержать не-ASCII символы, и возвращаемое значение может быть экземпляром [`unicode`](https://python-all.ru/2.7/library/functions.html#unicode).158159Аргументы имеют тот же смысл, что и в [`dump()`](https://python-all.ru/2.7/library/json.html#json.dump).160161> **Примечание**162>163> Ключи в парах ключ-значение JSON всегда имеют тип [`str`](https://python-all.ru/2.7/library/functions.html#str). При преобразовании словаря в JSON все его ключи приводятся к строкам. В результате, если словарь преобразовать в JSON, а затем обратно в словарь, полученный словарь может не совпадать с исходным. То есть `loads(dumps(x)) != x`, если x имеет нестроковые ключи.164165#### `json.load(fp[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])`166167Десериализует *fp* (поддерживающий `.read()` [файлоподобный объект](https://python-all.ru/2.7/glossary.html#term-file-like-object) содержащий документ JSON) в объект Python с помощью [таблицы преобразования](https://python-all.ru/2.7/library/json.html#json-to-py-table).168169Если содержимое *fp* закодировано с помощью кодировки на основе ASCII, отличной от UTF-8 (например, latin-1), то необходимо указать соответствующее имя *encoding*. Кодировки, не основанные на ASCII (такие как UCS-2), не допускаются; их следует обернуть с помощью `codecs.getreader(encoding)(fp)` или просто декодировать в объект [`unicode`](https://python-all.ru/2.7/library/functions.html#unicode) и передать в [`loads()`](https://python-all.ru/2.7/library/json.html#json.loads).170171*object\_hook* – необязательная функция, которая будет вызвана с результатом декодирования любого литерала объекта ([`dict`](https://python-all.ru/2.7/library/stdtypes.html#dict)). Возвращаемое значение *object\_hook* будет использовано вместо [`dict`](https://python-all.ru/2.7/library/stdtypes.html#dict). Эту возможность можно использовать для реализации пользовательских декодеров (например, [JSON-RPC](https://python-all.ru/2.7/library/json.html) подсказки класса).172173*object\_pairs\_hook* – это необязательная функция, которая будет вызвана с результатом декодирования любого объектного литерала в виде упорядоченного списка пар. Возвращаемое значение *object\_pairs\_hook* будет использовано вместо [`dict`](https://python-all.ru/2.7/library/stdtypes.html#dict). Эту возможность можно использовать для реализации собственных декодеров, которые полагаются на порядок декодирования пар ключ-значение (например, [`collections.OrderedDict()`](https://python-all.ru/2.7/library/collections.html#collections.OrderedDict) запоминает порядок вставки). Если также определён *object\_hook*, то *object\_pairs\_hook* имеет приоритет.174175Изменено в версии 2.7: Добавлена поддержка *object\_pairs\_hook*.176177*parse\_float*, если указан, будет вызван со строкой каждого декодируемого JSON-числа с плавающей запятой. По умолчанию это эквивалентно `float(num_str)`. Это может быть использовано для использования другого типа данных или парсера для JSON-чисел с плавающей запятой (например, [`decimal.Decimal`](https://python-all.ru/2.7/library/decimal.html#decimal.Decimal)).178179*parse\_int*, если указан, будет вызван со строкой каждого декодируемого JSON-целого числа. По умолчанию это эквивалентно `int(num_str)`. Это может быть использовано для использования другого типа данных или парсера для JSON-целых чисел (например, [`float`](https://python-all.ru/2.7/library/functions.html#float)).180181*parse\_constant*, если указан, будет вызван с одной из следующих строк: `'-Infinity'`, `'Infinity'`, `'NaN'`. Это может быть использовано для генерации исключения при обнаружении некорректных чисел JSON.182183Изменено в версии 2.7: *parse\_constant* больше не вызывается для ‘null’, ‘true’, ‘false’.184185Чтобы использовать пользовательский подкласс [`JSONDecoder`](https://python-all.ru/2.7/library/json.html#json.JSONDecoder), укажите его с помощью именованного аргумента `cls`; в противном случае используется [`JSONDecoder`](https://python-all.ru/2.7/library/json.html#json.JSONDecoder). Дополнительные именованные аргументы будут переданы конструктору класса.186187#### `json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])`188189Десериализует *s* (экземпляр [`str`](https://python-all.ru/2.7/library/functions.html#str) или [`unicode`](https://python-all.ru/2.7/library/functions.html#unicode), содержащий JSON-документ) в объект Python с использованием [таблицы преобразования](https://python-all.ru/2.7/library/json.html#json-to-py-table).190191Если *s* является экземпляром [`str`](https://python-all.ru/2.7/library/functions.html#str) и закодирован с помощью кодировки на основе ASCII, отличной от UTF-8 (например, latin-1), то необходимо указать соответствующее имя *encoding*. Кодировки, не основанные на ASCII (такие как UCS-2), не допускаются; их следует сначала декодировать в [`unicode`](https://python-all.ru/2.7/library/functions.html#unicode).192193Остальные аргументы имеют тот же смысл, что и в [`load()`](https://python-all.ru/2.7/library/json.html#json.load).194195## 18.2.2. Кодировщики и декодировщики196197#### `class json.JSONDecoder([encoding[, object_hook[, parse_float[, parse_int[, parse_constant[, strict[, object_pairs_hook]]]]]]])`198199Простой JSON-декодер.200201По умолчанию выполняет следующие преобразования при декодировании:202203| JSON | Python |204| --- | --- |205| объект | dict |206| массив | список |207| строка | unicode |208| число (int) | int, long |209| число (вещественное) | float |210| истина | True |211| ложь | False |212| null | None |213214Также `NaN`, `Infinity` и `-Infinity` распознаются как соответствующие значения `float`, что выходит за рамки спецификации JSON.215216*encoding* определяет кодировку, используемую для интерпретации любых объектов [`str`](https://python-all.ru/2.7/library/functions.html#str), декодированных этим экземпляром (по умолчанию UTF-8). Не влияет на декодирование объектов [`unicode`](https://python-all.ru/2.7/library/functions.html#unicode).217218Обратите внимание, что в настоящее время работают только кодировки, являющиеся надмножеством ASCII; строки других кодировок следует передавать в виде [`unicode`](https://python-all.ru/2.7/library/functions.html#unicode).219220*object\_hook*, если указан, будет вызываться с результатом декодирования каждого JSON объекта, и его возвращаемое значение будет использоваться вместо полученного [`dict`](https://python-all.ru/2.7/library/stdtypes.html#dict). Это может использоваться для предоставления пользовательской десериализации (например, для поддержки подсказок классов JSON-RPC).221222*object\_pairs\_hook*, если указан, будет вызван с результатом каждого JSON-объекта, декодированного в виде упорядоченного списка пар. Возвращаемое значение *object\_pairs\_hook* будет использовано вместо [`dict`](https://python-all.ru/2.7/library/stdtypes.html#dict). Эта возможность может быть использована для реализации собственных декодеров, которые полагаются на порядок декодирования пар ключ-значение (например, [`collections.OrderedDict()`](https://python-all.ru/2.7/library/collections.html#collections.OrderedDict) запоминает порядок вставки). Если *object\_hook* также определён, то *object\_pairs\_hook* имеет приоритет.223224Изменено в версии 2.7: Добавлена поддержка *object\_pairs\_hook*.225226*parse\_float*, если указан, будет вызван со строкой каждого декодируемого JSON-числа с плавающей запятой. По умолчанию это эквивалентно `float(num_str)`. Это может быть использовано для использования другого типа данных или парсера для JSON-чисел с плавающей запятой (например, [`decimal.Decimal`](https://python-all.ru/2.7/library/decimal.html#decimal.Decimal)).227228*parse\_int*, если указан, будет вызван со строкой каждого декодируемого JSON-целого числа. По умолчанию это эквивалентно `int(num_str)`. Это может быть использовано для использования другого типа данных или парсера для JSON-целых чисел (например, [`float`](https://python-all.ru/2.7/library/functions.html#float)).229230*parse\_constant*, если указан, будет вызван с одной из следующих строк: `'-Infinity'`, `'Infinity'`, `'NaN'`. Это может быть использовано для генерации исключения при обнаружении некорректных чисел JSON.231232Если *strict* равно false (по умолчанию `True`), то управляющие символы допускаются внутри строк. Под управляющими символами здесь понимаются символы с кодами в диапазоне 0–31, включая `'\t'` (табуляция), `'\n'`, `'\r'` и `'\0'`.233234Если десериализуемые данные не являются корректным JSON-документом, будет вызвано [`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError).235236#### `decode(s)`237238Возвращает представление в виде объекта Python для *s* (экземпляра [`str`](https://python-all.ru/2.7/library/functions.html#str) или [`unicode`](https://python-all.ru/2.7/library/functions.html#unicode), содержащего документ JSON).239240#### `raw_decode(s)`241242Декодирует документ JSON из *s* ([`str`](https://python-all.ru/2.7/library/functions.html#str) или [`unicode`](https://python-all.ru/2.7/library/functions.html#unicode), начинающийся с документа JSON) и возвращает кортеж из двух элементов: представление в виде объекта Python и индекс в *s*, на котором документ закончился.243244Это можно использовать для декодирования JSON-документа из строки, в конце которой могут быть лишние данные.245246#### `class json.JSONEncoder([skipkeys[, ensure_ascii[, check_circular[, allow_nan[, sort_keys[, indent[, separators[, encoding[, default]]]]]]]]])`247248Расширяемый JSON-кодировщик для структур данных Python.249250По умолчанию поддерживает следующие объекты и типы:251252| Python | JSON |253| --- | --- |254| dict | объект |255| list, tuple | массив |256| str, unicode | строка |257| int, long, float | число |258| True | истина |259| False | ложь |260| None | null |261262Чтобы расширить функциональность на другие объекты, создайте подкласс и реализуйте метод [`default()`](https://python-all.ru/2.7/library/json.html#json.JSONEncoder.default) с другим методом, который возвращает сериализуемый объект для `o`, если это возможно; в противном случае следует вызвать реализацию суперкласса (для возбуждения [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError)).263264Если *skipkeys* имеет значение false (по умолчанию), то попытка кодировать ключи, не являющиеся str, int, long, float или `None`, приведёт к [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError). Если *skipkeys* равно true, такие элементы просто пропускаются.265266Если *ensure\_ascii* равно true (по умолчанию), все не-ASCII символы в выводе экранируются последовательностями `\uXXXX`, и результатом являются экземпляры [`str`](https://python-all.ru/2.7/library/functions.html#str), состоящие только из ASCII-символов. Если *ensure\_ascii* равно false, результат может быть экземпляром [`unicode`](https://python-all.ru/2.7/library/functions.html#unicode). Обычно это происходит, если входные данные содержат строки unicode или используется параметр *encoding*.267268Если *check\_circular* равен true (по умолчанию), то списки, словари и пользовательские закодированные объекты проверяются на наличие циклических ссылок во время кодирования, чтобы предотвратить бесконечную рекурсию (которая привела бы к [`OverflowError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.OverflowError)). В противном случае такая проверка не выполняется.269270Если *allow\_nan* равно true (по умолчанию), то значения `NaN`, `Infinity` и `-Infinity` кодируются как есть. Такое поведение не соответствует спецификации JSON, но согласуется с большинством кодировщиков и декодировщиков на JavaScript. В противном случае при кодировании таких чисел с плавающей запятой возбуждается [`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError).271272Если *sort\_keys* равно true (по умолчанию `False`), то вывод словарей сортируется по ключам; это полезно для регрессионных тестов, чтобы обеспечить возможность сравнения JSON-сериализаций день ото дня.273274Если *indent* – неотрицательное целое число (по умолчанию `None`), то элементы массивов JSON и члены объектов будут выводиться с красивым форматированием с указанным отступом. Уровень отступа 0 вставляет только символы новой строки. `None` – наиболее компактное представление.275276> **Примечание**277>278> Поскольку разделителем элементов по умолчанию является `', '`, при указании *indent* в выводе могут появляться концевые пробелы. Чтобы избежать этого, можно использовать `separators=(',', ': ')`.279280Если указан, *separators* должен быть кортежем `(item_separator, key_separator)`. По умолчанию используются `(', ', ': ')`. Чтобы получить наиболее компактное представление JSON, следует указать `(',', ':')` для устранения пробелов.281282Если указан, *default* должен быть функцией, которая вызывается для объектов, которые не могут быть сериализованы иным способом. Она должна возвращать версию объекта, пригодную для JSON-кодирования, или возбуждать [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError). Если не указано, возбуждается [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError).283284Если *encoding* не равно `None`, то все входные строки перед кодированием в JSON будут преобразованы в unicode с использованием этой кодировки. По умолчанию используется UTF-8.285286#### `default(o)`287288В подклассе этот метод должен возвращать сериализуемый объект для *o* или вызывать базовую реализацию (для возбуждения [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError)).289290Например, чтобы поддерживать произвольные итераторы, можно реализовать default следующим образом:291292```python293def default(self, o):294   try:295       iterable = iter(o)296   except TypeError:297       pass298   else:299       return list(iterable)300   # Пусть метод базового класса по умолчанию возбуждает TypeError301   return JSONEncoder.default(self, o)302```303304#### `encode(o)`305306Возвращает строковое представление структуры данных Python в формате JSON, *o*. Например:307308```python309>>> JSONEncoder().encode({"foo": ["bar", "baz"]})310'{"foo": ["bar", "baz"]}'311```312313#### `iterencode(o)`314315Кодирует заданный объект *o* и выдаёт каждое строковое представление по мере готовности. Например:316317```python318for chunk in JSONEncoder().iterencode(bigobject):319    mysocket.write(chunk)320```321322## 18.2.3. Соответствие стандартам и интероперабельность323324Формат JSON определяется [**RFC 7159**](https://python-all.ru/2.7/library/json.html) и [ECMA-404](https://python-all.ru/2.7/library/json.html). В этом разделе подробно описывается степень соответствия модуля RFC. Для простоты [`JSONEncoder`](https://python-all.ru/2.7/library/json.html#json.JSONEncoder) и [`JSONDecoder`](https://python-all.ru/2.7/library/json.html#json.JSONDecoder) подклассы, а также параметры, не указанные явно, не рассматриваются.325326Этот модуль не полностью соответствует RFC, реализуя некоторые расширения, которые являются допустимым JavaScript, но недопустимым JSON. В частности:327328- Бесконечные и NaN числовые значения принимаются и выводятся;329- Повторяющиеся имена в объекте принимаются, и используется только значение последней пары.330331Поскольку RFC разрешает совместимым с RFC анализаторам принимать входные тексты, которые не соответствуют RFC, десериализатор этого модуля технически соответствует RFC при настройках по умолчанию.332333### 18.2.3.1. Кодировки символов334335RFC требует, чтобы JSON представлялся с использованием UTF-8, UTF-16 или UTF-32, причём UTF-8 рекомендуется по умолчанию для максимальной совместимости. Соответственно, этот модуль использует UTF-8 в качестве значения по умолчанию для параметра *encoding*.336337Десериализатор этого модуля напрямую работает только с кодировками, совместимыми с ASCII; UTF-16, UTF-32 и другие несовместимые с ASCII кодировки требуют применения обходных путей, описанных в документации к параметру *encoding* десериализатора.338339Согласно RFC это допускается, но не требуется; сериализатор данного модуля по умолчанию использует *ensure\_ascii=True*, экранируя вывод так, чтобы результирующие строки содержали только ASCII-символы.340341RFC запрещает добавление метки порядка байтов (BOM) в начало JSON-текста, и сериализатор этого модуля не добавляет BOM в свой вывод. RFC разрешает, но не требует, чтобы десериализаторы JSON игнорировали начальный BOM во входных данных. Десериализатор этого модуля возбуждает [`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError), когда присутствует начальный BOM.342343RFC явно не запрещает строки JSON, содержащие последовательности байтов, которые не соответствуют допустимым символам Unicode (например, непарные суррогаты UTF-16), но отмечает, что они могут вызывать проблемы совместимости. По умолчанию этот модуль принимает и выводит (когда они присутствуют в исходном [`str`](https://python-all.ru/2.7/library/functions.html#str)) кодовые точки таких последовательностей.344345### 18.2.3.2. Бесконечные и NaN значения чисел346347RFC не допускает представления бесконечных или NaN числовых значений. Несмотря на это, по умолчанию этот модуль принимает и выводит `Infinity`, `-Infinity` и `NaN`, как если бы они были допустимыми числовыми литералами JSON:348349```python350>>> # Ни один из этих вызовов не возбуждает исключение, но результаты не являются корректным JSON351>>> json.dumps(float('-inf'))352'-Infinity'353>>> json.dumps(float('nan'))354'NaN'355>>> # То же самое при десериализации356>>> json.loads('-Infinity')357-inf358>>> json.loads('NaN')359nan360```361362В сериализаторе параметр *allow\_nan* можно использовать для изменения этого поведения. В десериализаторе параметр *parse\_constant* можно использовать для изменения этого поведения.363364### 18.2.3.3. Повторяющиеся имена внутри объекта365366RFC указывает, что имена внутри JSON-объекта должны быть уникальными, но не предписывает, как обрабатывать повторяющиеся имена в JSON-объектах. По умолчанию этот модуль не вызывает исключение; вместо этого он игнорирует все, кроме последней пары имя-значение для данного имени:367368```python369>>> weird_json = '{"x": 1, "x": 2, "x": 3}'370>>> json.loads(weird_json)371{u'x': 3}372```373374Параметр *object\_pairs\_hook* можно использовать для изменения этого поведения.375376### 18.2.3.4. Значения верхнего уровня, не являющиеся объектом или массивом377378Старая версия JSON, определённая устаревшим [**RFC 4627**](https://python-all.ru/2.7/library/json.html), требовала, чтобы значение верхнего уровня JSON-текста было либо JSON-объектом, либо массивом (Python [`dict`](https://python-all.ru/2.7/library/stdtypes.html#dict) или `list`), и не могло быть null, boolean, числом или строкой. [**RFC 7159**](https://python-all.ru/2.7/library/json.html) снял это ограничение, и этот модуль не реализует и никогда не реализовывал это ограничение ни в своём сериализаторе, ни в десериализаторе.379380Тем не менее, для максимальной совместимости можно добровольно придерживаться этого ограничения.381382### 18.2.3.5. Ограничения реализации383384Некоторые реализации JSON-десериализаторов могут устанавливать ограничения на:385386- размер принимаемых JSON-текстов387- максимальный уровень вложенности JSON-объектов и массивов388- диапазон и точность JSON-чисел389- содержимое и максимальную длину JSON-строк390391Этот модуль не накладывает никаких подобных ограничений, кроме тех, что присущи соответствующим типам данных Python или самому интерпретатору Python.392393При сериализации в JSON учитывайте подобные ограничения в приложениях, которые могут потреблять ваш JSON. В частности, JSON-числа часто десериализуются в числа двойной точности IEEE 754 и, следовательно, подчиняются ограничениям диапазона и точности этого представления. Это особенно актуально при сериализации значений Python [`int`](https://python-all.ru/2.7/library/functions.html#int) чрезвычайно большой величины или при сериализации экземпляров «экзотических» числовых типов, таких как [`decimal.Decimal`](https://python-all.ru/2.7/library/decimal.html#decimal.Decimal).394395Сноски396397**[1](https://python-all.ru/2.7/library/json.html#id1)**398399Как отмечено в [списке ошибок RFC 7159](https://python-all.ru/2.7/library/json.html), JSON допускает символы U+2028 (LINE SEPARATOR) и U+2029 (PARAGRAPH SEPARATOR) в строках, тогда как JavaScript (начиная с ECMAScript Edition 5.1) – нет.400