json
— Кодер и декодер JSON¶
Исходный код: Lib/json/__init__.py
JSON (JavaScript Object Notation), определяемый RFC 7159 (которое устаревшее RFC 4627) и ECMA-404, является легким форматом обмена данными, вдохновленным JavaScript объектным литеральным синтаксисом (хотя он не является строгим подмножеством JavaScript [1]).
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]
... # Пусть базовый класс по умолчанию вызывает метод TypeError
... return json.JSONEncoder.default(self, 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, произведенный настройками по умолчанию этого модуля (в частности, разделители значения по умолчанию), является также подмножеством YAML 1.0 и 1.1. Модуль может также использоваться как последовательно-параллельньным преобразователем YAML.
Примечание
Кодеры и декодеры этого модуля по умолчанию сохраняют порядок ввода и вывода. Порядок теряется только в том случае, если нижележащие контейнеры не упорядочены.
До Python 3.7 dict
, не гарантировал порядок, таким
образом, входы и выходы, как правило, скремблировались, если collections.OrderedDict
конкретно не запрашивался. Начиная с Python 3.7, обычный dict
стал
сохранять порядок, поэтому больше нет необходимости указывать collections.OrderedDict
для
JSON генерации и парсинга.
Основное использование¶
-
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 будет верен (по умолчанию), то у продукции, как гарантируют, будут все поступающие знаки не ASCII, которых избегают. Если ensure_ascii будет ложным, то эти знаки будут произведены как есть.
Если check_circular ложный (по умолчанию:
True
), тогда циклическая проверка ссылок для контейнерных типов будет пропущена, и циклическая ссылка приведет кOverflowError
(или хуже).Если allow_nan имеет значение false (по умолчанию
True
), то это будетValueError
для сериализации вне диапазонаfloat
значения (nan
,inf
,-inf
) в строгом соответствии со спецификацией JSON. Если allow_nan будет верен, то их эквиваленты JavaScript (NaN
,Infinity
,-Infinity
) будут использоваться.Если indent является неотрицательным целым числом или строкой, то элементы массива JSON и члены объекта будут довольно напечатаны с этим уровнем отступа. Уровень отступа 0, отрицательный или
""
позволяет вставлять только новые строки.None
(по умолчанию) выбирает наиболее компактное представление. Использование положительного целого отступа, в котором много пробелов на уровень. Если indent - строка (такой как"\t"
), эта строка используется для отступа каждого уровня.Изменено в версии 3.2: Разрешить строки для indent в дополнение к целым числам.
Если определено, separators должен быть кортежем
(item_separator, key_separator)
. Значение по умолчанию равно(', ', ': ')
, если indent равноNone
и(',', ': ')
в противном случае. Чтобы получить самое компактное представление JSON, необходимо указать(',', ':')
, чтобы исключить пробел.Изменено в версии 3.4: Используйте
(',', ': ')
по умолчанию, если indent не являетсяNone
.Если указано, default должна быть функцией, вызываемой для объектов, которые в противном случае не могут быть сериализованы. Это должно возвращает encodable версия JSON объекта или поднимать
TypeError
. Если не определенный,TypeError
поднят.Если sort_keys true (по умолчанию:
False
), тогда вывод словарей будет сортирована по ключам.Чтобы использовать пользовательский
JSONEncoder
подкласс (например, тот, который отвергает методdefault()
, чтобы преобразовать в последовательную форму дополнительные типы), определите его с cls kwarg; в противном случае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, который будет расшифрован. По умолчанию это эквивалентно
float(num_str)
. Это может быть используемый для использования другого типа данных или парсер для floats JSON (например,decimal.Decimal
).parse_int, если указано, вызывается с строкой каждого JSON int, подлежащего декодированию. По умолчанию это эквивалентно
int(num_str)
. Это может быть используемый, чтобы использовать другой тип данных или парсер для целых чисел JSON (например,float
).parse_constant, если указано, вызывается с одним из следующих строки:
'-Infinity'
,'Infinity'
,'NaN'
. Это может быть используемый, чтобы поднять исключение, если с недействительными числами JSON сталкиваются.Изменено в версии 3.1: parse_constant не становится обращенным „null“, „true“, „true“ больше.
Чтобы использовать пользовательскую
JSONDecoder
подкласс, укажите ее вместе сcls
kwarg; в противном случае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()
, кроме encoding, который проигнорирован и осужден начиная с Python 3.1.Если десериализовываемые данные не будут действительным документом JSON, то будет поднято
JSONDecodeError
.Deprecated since version 3.1, will be removed in version 3.9: Ключевой аргумент encoding.
Изменено в версии 3.6: Теперь s может быть типа
bytes
илиbytearray
. Вход кодировка должен быть UTF-8, UTF-16 или UTF-32.
Кодирующие устройства и декодеры¶
-
class
json.
JSONDecoder
(*, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, strict=True, object_pairs_hook=None)¶ Простой декодер JSON.
Выполняет следующие трансляции при декодировании по умолчанию:
JSON Python object dict array list string str number (int) int number (real) float true True false False null None Он также понимает
NaN
,Infinity
и-Infinity
как соответствующиеfloat
значения, которые находятся за пределами JSON spec.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, который будет расшифрован. По умолчанию это эквивалентно
float(num_str)
. Это может быть используемый для использования другого типа данных или парсер для floats JSON (например,decimal.Decimal
).parse_int, если указано, вызывается с строка каждого JSON int, подлежащего декодированию. По умолчанию это эквивалентно
int(num_str)
. Это может быть используемый, чтобы использовать другой тип данных или парсер для целых чисел JSON (например,float
).parse_constant, если указано, вызывается с одним из следующих строки:
'-Infinity'
,'Infinity'
,'NaN'
. Это может быть используемый, чтобы поднять исключение, если с недействительными числами JSON сталкиваются.Если strict имеет значение false (
True
- значение по умолчанию), то внутри строки будут разрешены управляющие символы. Управляющие символы в этом контекст - это символы с символ коды в диапазоне 0-31, включая'\t'
(tab),'\n'
,'\r'
и'\0'
.Если десериализовываемые данные не будут действительным документом JSON, то
JSONDecodeError
будет поднят.Изменено в версии 3.6: Все параметры теперь только ключевые.
-
decode
(s)¶ Возвращает представление Python s (
str
сущность, содержащий документ JSON).JSONDecodeError
будет вызван, если указанный документ JSON недействителен.
-
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 dict object list, tuple array str string int, float, int- & float-derived Enums number True true False false None null Изменено в версии 3.4: Добавленная поддержка int- и float-полученные классы Enum.
Чтобы расширить это, чтобы распознать другие объекты, подкласс и реализовать метод
default()
с другим методом, который возвращает сериализуемый объект дляo
, если это возможно, в противном случае он должен вызвать реализацию суперкласс (чтобы поднятьTypeError
).Если skipkeys имеет значение false (значение по умолчанию), то попытка кодировка ключей, не являющихся
str
,int
,float
илиNone
, являетсяTypeError
. Если skipkeys верен, такие предметы просто пропущены.Если ensure_ascii будет верен (по умолчанию), то у продукции, как гарантируют, будут все поступающие знаки не ASCII, которых избегают. Если ensure_ascii будет ложным, то эти знаки будут произведены как есть.
Если check_circular имеет значение true (значение по умолчанию), то списки, словари и пользовательские кодированный объекты будут проверяться на наличие циклических ссылок во время кодировка, чтобы предотвратить бесконечную рекурсию (которая вызовет
OverflowError
). В противном случае такая проверка не проводится.Если allow_nan имеет значение true (значение по умолчанию), то
NaN
,Infinity
и-Infinity
будут кодированный как таковые. Такое поведение не совместимо со спецификацией JSON, но согласуется с большинством кодеры и декодеры на основе JavaScript. В противном случае кодировать такие поплавки будетValueError
.Если sort_keys верен (по умолчанию:
False
), тогда продукция словарей будет сортирована ключом; это полезно для регрессионных тестов для обеспечения возможности сравнения сериализаций JSON на повседневной основе.Если indent является неотрицательным целым числом или строка, то элементы массива JSON и члены объекта будут довольно напечатаны с этим уровнем отступа. Уровень отступа 0, отрицательный или
""
позволяет вставлять только новые строки.None
(по умолчанию) выбирает наиболее компактное представление. Использование положительного целого отступа, в котором много пробелов на уровень. Если indent - строка (такой как"\t"
), эта строка используется для отступа каждого уровня.Изменено в версии 3.2: Разрешить строки для indent в дополнение к целым числам.
Если определено, separators должен быть кортежем
(item_separator, key_separator)
. Значение по умолчанию равно(', ', ': ')
, если indent равноNone
и(',', ': ')
в противном случае. Чтобы получить самое компактное представление JSON, необходимо указать(',', ':')
, чтобы исключить пробел.Изменено в версии 3.4: Используйте
(',', ': ')
по умолчанию, если indent не являетсяNone
.Если указано, default должна быть функцией, вызываемой для объектов, которые в противном случае не могут быть сериализованы. Это должно возвращает encodable версия JSON объекта или поднимать
TypeError
. Если не определенный,TypeError
поднят.Изменено в версии 3.6: Все параметры теперь только ключевые.
-
default
(o)¶ Осуществите этот метод в подкласс, таким образом, что это возвращает сериализуемый объект для o, или называет основное внедрение (чтобы поднять
TypeError
).Например, для поддержки произвольных итераторов можно реализовать такие значения по умолчанию:
def default(self, o): try: iterable = iter(o) except TypeError: pass else: return list(iterable) # Пусть базовый класс по умолчанию метод поднимает TypeError return json.JSONEncoder.default(self, o)
-
encode
(o)¶ Возвращает JSON строка представление структуры Python данных, o. Например:
>>> json.JSONEncoder().encode({"foo": ["bar", "baz"]}) '{"foo": ["bar", "baz"]}'
-
iterencode
(o)¶ Кодировать данный объект, o и yield каждое представление строка как доступное. Например:
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. В этом
разделе описывается уровень соответствия модуля RFC. Для простоты 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 объектами и Юникод строки
и, таким образом, не
затрагивает напрямую проблему кодировок символ.
RFC запрещает добавление метки порядка байтов (BOM) к началу текста JSON, и
сериализатор этого модуля не добавляет спецификацию к его выходу. RFC позволяет,
но не требует, чтобы десериализаторы JSON игнорировали начальную спецификацию
при вводе данных. deserializer этого модуля поднимает ValueError
, когда
начальный BOM присутствует.
RFC явно не запрещает JSON строки, которые содержат последовательности
байта, которые не соответствуют действительным знакам Юникод (например,
несоединенные суррогаты UTF-16), но он действительно отмечает, что они могут
вызвать проблемы совместимости. По умолчанию модуль принимает и выводит
(если присутствует в исходном str
) точки код для таких
последовательностей.
Бесконечные значения и значения числа NaN¶
RFC не допускает представления бесконечного или NaN числовые значения. Несмотря
на это, по умолчанию модуль принимает и выводит Infinity
, -Infinity
и
NaN
так, как будто они являются действительным номером JSON литерал
значения:
>>> # Ни один из этих вызовов не поднимет исключение, но результаты не являются допустимыми JSON
>>> json.dumps(float('-inf'))
'-Infinity'
>>> json.dumps(float('nan'))
'NaN'
>>> # То же самое при десериализации
>>> 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, булевым,
числом или строковое значение. 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.
-
--json-lines
¶
Проанализировать каждую входную строку как отдельный объект JSON.
Добавлено в версии 3.8.
-
-h
,
--help
¶
Отображение справочного сообщения.
Сноски
[1] | Как отмечено в исправления для RFC 7159, JSON допускает использование литералов U+2028 (LINE SEPARATOR) и U+2029 (PARAGRAPH SEPARATOR) символов в строках, то время как JavaScript (начиная с ECMAScript Edition 5.1) - нет. |