import json json.JSONEncoder(*, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None)
skipkeys=False
- игнорирование не базовых типов ключей в словарях,ensure_ascii=True
- экранирование не-ASCII символов,check_circular=True
- проверка циклических ссылок,allow_nan=True
- представление значений nan
, inf
, -inf
в JSON,sort_keys=False
- сортировка словарей,indent=None
- количество отступов при сериализации,separators=None
- разделители используемые в JSON,default=None
- метод подкласса JSONEncoder
для объектов, которые не могут быть сериализованы,Функция JSONEncoder()
модуля json
расширяет возможности преобразование структур данных Python в формат JSON.
Поддерживает следующие объекты и типы по умолчанию:
Python | JSON |
dict | object |
list, tuple | array |
str | string |
int, float, int- & float-derived Enums | number |
True | true |
False | false |
None | null |
Чтобы расширить возможности преобразование других объектов, создайте подкласс и реализуйте в нем метод default()
, который возвращает сериализуемый объект для obj
, если это возможно, в противном случае он должен вызвать реализацию суперкласса, которая будет вызвать исключение TypeError
.
Если аргумент skipkeys
имеет значение False
(по умолчанию), то вызывается TypeError
для попытки преобразования ключей, которые не являются str
, int
, float
или None
. Если skipkeys
имеет значение True
, такие элементы просто пропускаются.
Если аргумент sure_ascii
имеет значение True
(по умолчанию), на выходе гарантированно все входящие не ASCII символы будут экранированы последовательностями \uXXXX. Если sure_ascii
имеет значение False
, то не ASCII символы будут выводиться как есть.
Если аргумент check_circular=True
(по умолчанию), тогда списки, словари и самостоятельно закодированные объекты будут проверяться на циклические ссылки во время кодировки, чтобы предотвратить бесконечную рекурсию, что может вызвать исключение OverflowError
. В другом случае, такая проверка не выполняется.
Если аргумент allow_nan=False
(по умолчанию: True
), при каждой попытке сериализировать значение float
, выходящее за допустимые пределы (nan
, inf
, -inf
), будет возникать исключение ValueError
, в соответствии с сертификацией JSON. В случае если allow_nan=True
, будут использованы JavaScript аналоги (NaN
, Infinity
, -Infinity
).
Если аргумент sort_keys=True
(по умолчанию: False), выводимый словарь будет отсортирован по именам ключей, что полезно для регрессивного тестирования.
Если аргумент indent
является неотрицательным целым числом или строкой, то вложенные объекты и массивы JSON будут выводиться с этим количеством отступов. Если уровень отступа равен 0, отрицательный или является пустой строкой ''
, будут использоваться новые строки без отступов. Если indent=None
(по умолчанию), то на выходе JSON будет наиболее компактным. Если indent
будет строкой типа '\t'
, то это значение будет использоваться в качестве отступа.
Если указан аргумент separator
, то он должен быть кортежем типа (item_separator, key_separator)
. По умолчанию используется (', ', ': ')
если indent=None
. Для получения наиболее компактного представления JSON следует использовать (',', ':')
, чтобы уменьшить количество пробелов.
Значение default
должно быть методом подкласса JSONEncoder
. Он вызывается для объектов, которые не могут быть сериализованы. Метод должен вернуть кодируемую версию объекта JSON или вызывать исключение TypeError
. Если аргумент default
не указан и какой-то из объектов не может быть преобразован в JSON, то возникает ошибка TypeError
.
JSONEncoder()
.default(obj)
:Реализует метод в подклассе JSONEncoder
так, чтобы он возвращал сериализуемый объект для obj
или вызывал базовую реализацию.
Например, чтобы поддерживать произвольные итераторы, вы можете реализовать метод default()
следующим образом:
def default(self, obj): try: iterable = iter(obj) except TypeError: pass else: return list(iterable) # базовый класс вызывает исключение TypeError return json.JSONEncoder.default(self, obj)
encode(obj)
:Возвращает строковое представление JSON структуры данных Python.
>>> json.JSONEncoder().encode({"foo": ["bar", "baz"]}) # '{"foo": ["bar", "baz"]}'
iterencode(o)
:Преобразовывает переданный объект o и выдаёт каждое строковое представление, как только оно становится доступным. Например:
for chunk in json.JSONEncoder().iterencode(bigobject): mysocket.write(chunk)
>>> 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 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', ']']