json — Кодировщик и декодер JSON
Исходный код: Lib/json/__init__.py
JSON (JavaScript Object Notation), определённый в RFC 7159 (который устарел RFC 4627) и ECMA-404, является лёгким форматом обмена данными, вдохновлённым синтаксисом литералов объектов JavaScript (хотя он не является строгой подмножеством JavaScript [1]).
Предупреждение
Будьте осторожны при парсинге данных JSON из ненадежных источников. Злонамеренная строка JSON может заставить декодер потреблять значительные ресурсы процессора и памяти. Рекомендуется ограничивать размер данных, подлежащих парсингу.
json предоставляет API, знакомый пользователям стандартной библиотеки marshal и pickle модулей.
Кодирование базовых иерархий Python-объектов:
>>> import json
>>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
'["foo", {"bar": ["baz", null, 1.0, 2]}]'
>>> print(json.dumps("\"foo\bar"))
"\"foo\bar"
>>> print(json.dumps('\u1234'))
"\u1234"
>>> print(json.dumps('\\'))
"\\"
>>> print(json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True))
{"a": 0, "b": 0, "c": 0}
>>> from io import StringIO
>>> io = StringIO()
>>> json.dump(['streaming API'], io)
>>> io.getvalue()
'["streaming API"]'
Компактная кодировка:
>>> import json
>>> json.dumps([1, 2, 3, {'4': 5, '6': 7}], separators=(',', ':'))
'[1,2,3,{"4":5,"6":7}]'
Красивая печать:
>>> import json
>>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4))
{
"4": 5,
"6": 7
}
Декодирование JSON:
>>> import json
>>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')
['foo', {'bar': ['baz', None, 1.0, 2]}]
>>> json.loads('"\\"foo\\bar"')
'"foo\x08ar'
>>> from io import StringIO
>>> io = StringIO('["streaming API"]')
>>> json.load(io)
['streaming API']
Специализация декодирования JSON-объектов:
>>> import json
>>> def as_complex(dct):
... if '__complex__' in dct:
... return complex(dct['real'], dct['imag'])
... return dct
...
>>> json.loads('{"__complex__": true, "real": 1, "imag": 2}',
... object_hook=as_complex)
(1+2j)
>>> import decimal
>>> json.loads('1.1', parse_float=decimal.Decimal)
Decimal('1.1')
Расширение JSONEncoder:
>>> import json >>> class ComplexEncoder(json.JSONEncoder): ... def default(self, obj): ... if isinstance(obj, complex): ... return [obj.real, obj.imag] ... # Let the base class default method raise the TypeError ... return super().default(obj) ... >>> json.dumps(2 + 1j, cls=ComplexEncoder) '[2.0, 1.0]' >>> ComplexEncoder().encode(2 + 1j) '[2.0, 1.0]' >>> list(ComplexEncoder().iterencode(2 + 1j)) ['[2.0', ', 1.0', ']']
Использование json.tool из командной строки для проверки и красивой печати:
$ echo '{"json":"obj"}' | python -m json.tool
{
"json": "obj"
}
$ echo '{1.2:3.4}' | python -m json.tool
Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
См. Командная строка для подробной документации.
Примечание
JSON является подмножеством YAML 1.2. JSON, генерируемый по умолчанию (в частности, значение по умолчанию separators) также является подмножеством YAML 1.0 и 1.1. Таким образом, этот модуль также может быть использован как YAML-сериализатор.
Примечание
Кодировщики и декодеры этого модуля по умолчанию сохраняют порядок ввода и вывода. Порядок теряется только если базовые контейнеры неупорядоченные.
Базовое использование
-
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) -
Сериализуйте obj в формате JSON в поток fp (объект, поддерживающий
.write()объект, подобный файлу) с помощью этой таблицы преобразования.Если skipkeys имеет значение True (по умолчанию:
False), то ключи словарей, которые не являются базовыми типами (str,int,float,bool,None) будут пропущены вместо повышения исключенияTypeError.Модуль
jsonвсегда генерирует объектыstr, а не объектыbytes. Поэтому,fp.write()должен поддерживать входные данные типаstr.Если ensure_ascii имеет значение True (по умолчанию), то все входящие символы, не являющиеся ASCII, гарантированно будут экранированы в выводе. Если ensure_ascii имеет значение False, эти символы будут выведены как есть.
Если check_circular имеет значение False (по умолчанию:
True), то проверка на циклические ссылки для контейнерных типов будет пропущена, и циклическая ссылка приведет к исключениюRecursionError(или худшему).Если allow_nan имеет значение False (по умолчанию:
True), то сериализация значенийfloatвне диапазона (nan,inf,-inf) будет вызыватьValueErrorв строгом соответствии со спецификацией JSON. Если allow_nan имеет значение True, будут использованы их эквиваленты в JavaScript (NaN,Infinity,-Infinity).Если indent — целое число больше или равно 0 или строка, то элементы массива JSON и члены объекта будут красиво отформатированы с указанным уровнем отступа. Уровень отступа 0, отрицательный или
""будет добавлять только переводы строк.None(по умолчанию) выбирает наиболее компактное представление. Использование положительного целого числа для indent добавляет столько пробелов на каждый уровень. Если indent — строка (например,"\t"), эта строка используется для отступа каждого уровня.Изменено в версии 3.2: Допускаются строки для indent в дополнение к целым числам.
Если указано, separators должен быть кортежем
(item_separator, key_separator). По умолчанию это(', ', ': ')если indent —Noneи(',', ': ')в противном случае. Для получения наиболее компактного представления JSON необходимо указать(',', ':')для исключения пробелов.Изменено в версии 3.4: Используется
(',', ': ')в качестве значения по умолчанию, если indent неNone.Если указано, default должна быть функция, которая вызывается для объектов, которые нельзя иначе сериализовать. Она должна возвращать сериализуемую в JSON версию объекта или генерировать исключение
TypeError. Если не указано, генерируетсяTypeError.Если sort_keys имеет значение True (по умолчанию:
False), то вывод словарей будет отсортирован по ключу.Чтобы использовать пользовательский подкласс
JSONEncoder(например, тот, который переопределяет методdefault()для сериализации дополнительных типов), укажите его с помощью параметра cls; в противном случае используетсяJSONEncoder.Изменено в версии 3.6: Все необязательные параметры теперь являются параметрами только по ключевому слову.
-
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) -
Сериализуйте obj в строку формата JSON
strс помощью этой таблицы преобразования. Аргументы имеют тот же смысл, что и вdump().Примечание
Ключи в парах ключ/значение JSON всегда имеют тип
str. При преобразовании словаря в JSON все ключи словаря приводятся к строкам. В результате, если словарь преобразуется в JSON, а затем обратно в словарь, он может не совпасть с исходным, то естьloads(dumps(x)) != xесли у x есть ключи, не являющиеся строками.
-
json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw) -
Десериализуйте fp (текстовый файл или двоичный файл, поддерживающий
.read(), содержащий документ JSON) в объект Python с использованием этой таблицы преобразования.object_hook — необязательная функция, которая будет вызываться с результатом любого декодированного объекта-литерала (словарем
dict). Возвращаемое значение object_hook будет использоваться вместоdict. Эта функция может использоваться для реализации пользовательских декодеров (например, JSON-RPC с подсказками классов).object_pairs_hook — необязательная функция, которая будет вызываться с результатом любого декодированного объекта-литерала с упорядоченным списком пар. Возвращаемое значение object_pairs_hook будет использоваться вместо
dict. Эта функция может использоваться для реализации пользовательских декодеров. Если также определен object_hook, то object_pairs_hook имеет приоритет.Изменено в версии 3.1: Добавлена поддержка object_pairs_hook.
Если указано, parse_float будет вызываться со строкой каждого декодируемого JSON-числа с плавающей запятой. По умолчанию это эквивалентно
float(num_str). Это может быть использовано для использования другого типа данных или парсера для JSON-чисел с плавающей запятой (например,decimal.Decimal).Если указано, parse_int будет вызываться со строкой каждого декодируемого JSON-целого числа. По умолчанию это эквивалентно
int(num_str). Это может быть использовано для использования другого типа данных или парсера для JSON-целых чисел (например,float).Изменено в версии 3.11: По умолчанию parse_int типа
int()теперь ограничивает максимальную длину строки целого числа с помощью ограничения интерпретатора длины преобразования строки целого числа, чтобы избежать атак с отказом в обслуживании.Если указано, parse_constant будет вызываться со следующими строками:
'-Infinity','Infinity','NaN'. Это может быть использовано для повышения исключения, если встречены некорректные JSON-числа.Изменено в версии 3.1: parse_constant больше не вызывается для ‘null’, ‘true’, ‘false’.
Чтобы использовать пользовательский подкласс
JSONDecoder, укажите его с помощью параметраcls; в противном случае используетсяJSONDecoder. Дополнительные ключевые аргументы будут переданы в конструктор класса.Если данные, которые десериализуются, не являются корректным JSON-документом, будет вызвано исключение
JSONDecodeError.Изменено в версии 3.6: Все необязательные параметры теперь являются параметрами только по ключевому слову.
Изменено в версии 3.6: fp теперь может быть двоичным файлом. Кодировка ввода должна быть UTF-8, UTF-16 или UTF-32.
-
json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw) -
Десериализовать s (объект типа
str,bytesилиbytearray, содержащий JSON-документ) в объект Python с использованием этой таблицы преобразования.Другие аргументы имеют то же значение, что и в
load().Если данные, подлежащие десериализации, не являются корректным JSON-документом, будет поднято исключение
JSONDecodeError.Изменено в версии 3.6: s теперь может быть типа
bytesилиbytearray. Кодировка входных данных должна быть UTF-8, UTF-16 или UTF-32.Изменено в версии 3.9: Ключевой аргумент encoding был удален.
Кодировщики и декодировщики
-
class json.JSONDecoder(*, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, strict=True, object_pairs_hook=None) -
Простой декодер JSON.
По умолчанию выполняет следующие преобразования при декодировании:
JSON
Python
объект
словарь
массив
список
строка
строка
число (целое)
целое число
число (вещественное)
число с плавающей точкой
true
True
false
False
null
None
Он также понимает
NaN,Infinity, и-Infinityкак соответствующие им значенияfloat, что выходит за рамки спецификации JSON.Если задан параметр object_hook, он будет вызываться с результатом каждого декодированного JSON-объекта, а его возвращаемое значение будет использовано вместо заданного
dict. Это можно использовать для предоставления пользовательских десериализаций (например, для поддержки JSON-RPC подсказок классов).Если задан параметр object_pairs_hook, он будет вызываться с результатом каждого декодированного JSON-объекта со упорядоченным списком пар. Возвращаемое значение object_pairs_hook будет использоваться вместо
dict. Эта функция может быть использована для реализации пользовательских декодеров. Если также определен object_hook, то object_pairs_hook имеет приоритет.Изменено в версии 3.1: Добавлена поддержка object_pairs_hook.
Если задан параметр parse_float, он будет вызываться со строкой каждого JSON-числа с плавающей точкой, подлежащего декодированию. По умолчанию это эквивалентно
float(num_str). Это можно использовать для использования другого типа данных или парсера для JSON-чисел с плавающей точкой (например,decimal.Decimal).Если задан параметр parse_int, он будет вызываться со строкой каждого JSON-целого числа, подлежащего декодированию. По умолчанию это эквивалентно
int(num_str). Это можно использовать для использования другого типа данных или парсера для JSON-целых чисел (например,float).Если задан параметр parse_constant, он будет вызываться с одной из следующих строк:
'-Infinity','Infinity','NaN'. Это можно использовать для повышения исключения, если будут обнаружены недействительные JSON-числа.Если параметр strict равен false (по умолчанию), то управляющие символы внутри строк будут разрешены. Управляющие символы в данном контексте — это те, у которых коды символов находятся в диапазоне от 0 до 31, включая
'\t'(табуляция),'\n','\r'и'\0'.Если данные, которые десериализуются, не являются допустимым JSON-документом, будет возбуждено исключение
JSONDecodeError.Изменено в версии 3.6: Все параметры теперь являются только ключевыми.
-
decode(s) -
Возвращает представление Python объекта s (объекта
str, содержащего JSON-документ).Если заданный JSON-документ некорректен, будет возбуждено исключение
JSONDecodeError.
-
raw_decode(s) -
Декодирует JSON-документ из s (строка
str, начинающаяся с JSON-документа) и возвращает кортеж из 2-х элементов: представление Python и индекс в s, где закончился документ.Это можно использовать для декодирования JSON-документа из строки, которая может содержать дополнительные данные в конце.
-
-
class json.JSONEncoder(*, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None) -
Расширяемый JSON-кодировщик для структур данных Python.
По умолчанию поддерживает следующие объекты и типы:
Python
JSON
словарь
объект
список, кортеж
массив
строка
строка
целое, вещественное, целые и вещественные перечисления
число
True
true
False
false
None
null
Изменено в версии 3.4: Добавлена поддержка целых и вещественных классов перечислений.
Чтобы расширить это, чтобы он распознавал другие объекты, создайте подкласс и реализуйте метод
default()с другим методом, который возвращает сериализуемый объект дляoесли возможно, в противном случае он должен вызвать реализацию суперкласса (чтобы вызватьTypeError).Если skipkeys равно false (по умолчанию), то при попытке закодировать ключи, которые не являются
str,int,floatилиNone, будет возбуждено исключениеTypeError. Если skipkeys равно true, такие элементы просто пропускаются.Если ensure_ascii равно true (по умолчанию), гарантируется, что в выходных данных все входящие не-ASCII символы будут экранированы. Если ensure_ascii равно false, эти символы будут выведены как есть.
Если check_circular равно true (по умолчанию), то списки, словари и пользовательские закодированные объекты будут проверяться на циклические ссылки во время кодирования, чтобы предотвратить бесконечную рекурсию (что приведет к
RecursionError). В противном случае такая проверка не выполняется.Если allow_nan равно true (по умолчанию), то
NaN,Infinity, и-Infinityбудут закодированы как таковые. Это поведение не соответствует спецификации JSON, но согласуется с большинством JavaScript-кодировщиков и декодеров. В противном случае, это будетValueErrorдля кодирования таких чисел с плавающей точкой.Если sort_keys равно true (по умолчанию:
False), то выходные данные словарей будут отсортированы по ключу; это полезно для регрессионных тестов, чтобы убедиться, что JSON-сериализации можно сравнивать изо дня в день.Если indent — это целое неотрицательное число или строка, то элементы JSON-массивов и члены JSON-объектов будут отформатированы с указанным уровнем отступа. Уровень отступа 0, отрицательное число или
""будут вставлять только новые строки.None(по умолчанию) выбирает наиболее компактное представление. Использование положительного целого числа indent вставляет отступы на столько пробелов на каждый уровень. Если indent — это строка (например,"\t"), эта строка используется для отступа каждого уровня.Изменено в версии 3.2: Разрешены строки для indent в дополнение к целым числам.
Если задан, separators должен быть кортежем. По умолчанию
(', ', ': ')если indentNoneи(',', ': ')в противном случае. Для получения наиболее компактного JSON-представления необходимо указать(',', ':')для устранения пробелов.Изменено в версии 3.4: Используется
(',', ': ')в качестве значения по умолчанию, если indent неNone.Если задан, default должен быть функцией, которая вызывается для объектов, которые нельзя сериализовать другими способами. Она должна возвращать JSON-кодируемую версию объекта или возбуждать
TypeError. Если не указано, возбуждаетсяTypeError.Изменено в версии 3.6: Все параметры теперь являются только ключевыми.
-
default(o) -
Реализуйте этот метод в подклассе таким образом, чтобы он возвращал сериализуемый объект для o или вызывал базовую реализацию (чтобы возбудить
TypeError).Например, чтобы поддерживать произвольные итераторы, можно реализовать
default()так:def default(self, o): try: iterable = iter(o) except TypeError: pass else: return list(iterable) # Let the base class default method raise the TypeError return super().default(o)
-
encode(o) -
Возвращает JSON-строковое представление структуры данных Python, o. Например:
>>> json.JSONEncoder().encode({"foo": ["bar", "baz"]}) '{"foo": ["bar", "baz"]}'
-
iterencode(o) -
Кодирует заданный объект o и выдает каждое строковое представление по мере доступности. Например:
for chunk in json.JSONEncoder().iterencode(bigobject): mysocket.write(chunk)
-
Исключения
-
exception json.JSONDecodeError(msg, doc, pos) -
Подкласс
ValueErrorс дополнительными атрибутами:-
msg -
Неформализованное сообщение об ошибке.
-
doc -
JSON-документ, который анализировался.
-
pos -
Начальный индекс в doc, где произошел сбой анализа.
-
lineno -
Строка, соответствующая pos.
-
colno -
Столбец, соответствующий pos.
Добавлен в версии 3.5.
-
Соответствие стандарту и межплатформенная совместимость
Формат JSON определен в RFC 7159 и ECMA-404. Этот раздел описывает уровень соответствия модуля данному стандарту. Для простоты, JSONEncoder и JSONDecoder подклассы, а также параметры, отличные от явно указанных, не рассматриваются.
Этот модуль не строго соответствует RFC, реализуя некоторые расширения, которые допустимы в JavaScript, но не в JSON. В частности:
- Бесконечные и NaN числовые значения принимаются и выводятся;
- Повторные имена в объекте принимаются, и используется только значение последней пары имя-значение.
Поскольку RFC разрешает RFC-совместимым анализаторам принимать тексты, которые не соответствуют RFC, десериализатор этого модуля технически RFC-совместим при стандартных настройках.
Кодировки символов
RFC требует, чтобы JSON представлялся с использованием UTF-8, UTF-16 или UTF-32, при этом UTF-8 рекомендуется по умолчанию для максимальной межплатформенной совместимости.
Как разрешено, но не обязательно, RFC, сериализатор этого модуля устанавливает ensure_ascii=True по умолчанию, тем самым экранируя вывод, так что результирующие строки содержат только символы ASCII.
Помимо параметра ensure_ascii, этот модуль определен строго в терминах преобразования между объектами Python и Unicode strings, и поэтому не рассматривает вопрос кодировок символов напрямую.
RFC запрещает добавление метки порядка байтов (BOM) в начало текста JSON, и сериализатор этого модуля не добавляет BOM к своему выводу. RFC разрешает, но не требует, чтобы десериализаторы JSON игнорировали начальную метку BOM в своем вводе. Этот модуль-десериализатор вызывает ValueError, когда присутствует начальная метка BOM.
RFC не запрещает явно JSON-строки, содержащие последовательности байтов, которые не соответствуют допустимым символам Unicode (например, неспаренные суррогаты UTF-16), но отмечает, что они могут вызвать проблемы с межплатформенной совместимостью. По умолчанию этот модуль принимает и выводит (если они присутствуют в исходном str) коды символов для таких последовательностей.
Бесконечные и NaN числовые значения
RFC не разрешает представление бесконечных или NaN числовых значений. Несмотря на это, по умолчанию этот модуль принимает и выводит Infinity, -Infinity, и NaN так, как будто они являются допустимыми числовыми литералами JSON:
>>> # Neither of these calls raises an exception, but the results are not valid JSON
>>> json.dumps(float('-inf'))
'-Infinity'
>>> json.dumps(float('nan'))
'NaN'
>>> # Same when deserializing
>>> json.loads('-Infinity')
-inf
>>> json.loads('NaN')
nan
В сериализаторе параметр allow_nan может быть использован для изменения этого поведения. В десериализаторе параметр parse_constant может быть использован для изменения этого поведения.
Повторные имена в объекте
RFC указывает, что имена в JSON-объекте должны быть уникальными, но не предписывает, как следует обрабатывать повторяющиеся имена в JSON-объектах. По умолчанию этот модуль не генерирует исключение; вместо этого он игнорирует все, кроме последней пары имя-значение для данного имени:
>>> weird_json = '{"x": 1, "x": 2, "x": 3}'
>>> json.loads(weird_json)
{'x': 3}
Параметр object_pairs_hook может быть использован для изменения этого поведения.
Значения верхнего уровня, не являющиеся объектами и массивами
Старая версия JSON, определенная устаревшим RFC 4627, требовала, чтобы значение верхнего уровня текста JSON должно быть либо JSON-объектом, либо массивом (Python dict или list), и не могло быть JSON null, boolean, числом или строковым значением. RFC 7159 убрало это ограничение, и этот модуль не реализовывал и никогда не реализовывал это ограничение ни в сериализаторе, ни в десериализаторе.
Тем не менее, для максимальной совместимости вы можете добровольно придерживаться этого ограничения.
Ограничения реализации
Некоторые реализации JSON-десериализаторов могут устанавливать ограничения на:
- размер принимаемых текстов JSON
- максимальный уровень вложенности JSON-объектов и массивов
- диапазон и точность JSON-чисел
- содержимое и максимальную длину JSON-строк
Этот модуль не накладывает никаких таких ограничений, кроме тех, которые существуют в соответствующих типах данных Python или самом интерпретаторе Python.
При сериализации в JSON будьте внимательны к таким ограничениям в приложениях, которые могут использовать ваш JSON. В частности, JSON-числа обычно десериализуются в числа с двойной точностью IEEE 754 и, следовательно, подвержены ограничениям по диапазону и точности этого представления. Это особенно актуально при сериализации значений Python int чрезвычайно большой величины или при сериализации экземпляров «экзотических» числовых типов, таких как decimal.Decimal.
Командная строка
Исходный код: Lib/json/tool.py
Модуль json.tool предоставляет простой интерфейс командной строки для проверки и форматирования JSON-объектов.
Если необязательные аргументы infile и outfile не указаны, будут использованы соответственно sys.stdin и sys.stdout:
$ echo '{"json": "obj"}' | python -m json.tool
{
"json": "obj"
}
$ echo '{1.2:3.4}' | python -m json.tool
Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
Изменено в версии 3.5: Вывод теперь в том же порядке, что и вход. Используйте опцию --sort-keys для сортировки вывода словарей по ключам в алфавитном порядке.
Параметры командной строки
-
infile -
JSON-файл для проверки или форматирования:
$ python -m json.tool mp_films.json [ { "title": "And Now for Something Completely Different", "year": 1971 }, { "title": "Monty Python and the Holy Grail", "year": 1975 } ]Если infile не указан, читает из
sys.stdin.
-
outfile -
Записывает результат infile в указанный outfile. В противном случае записывает в
sys.stdout.
-
--sort-keys -
Сортирует вывод словарей в алфавитном порядке по ключам.
Добавлен в версии 3.5.
-
--no-ensure-ascii -
Отключить экранирование не-ascii символов, см.
json.dumps()для получения дополнительной информации.Добавлен в версии 3.9.
-
--json-lines -
Анализирует каждую строку ввода как отдельный JSON-объект.
Добавлен в версии 3.8.
-
--indent, --tab, --no-indent, --compact -
Взаимоисключающие параметры для управления отступами.
Добавлен в версии 3.9.
-
-h, --help -
Показать сообщение справки.
Примечания
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/json.html