Модуль json
Работа с форматом json
Модуль json преобразует объекты Python в JSON и обратно. Он поддерживает словари, списки/кортежи, строки, числа, True, False и None. Объекты dev.Reg, сокеты и другие ресурсы перед сериализацией преобразуйте в обычные значения.
dumps
json.dumps(obj, *, separators=None)
Возвращает строку JSON. Параметр separators передаётся по имени: пара строк (разделитель_элементов, разделитель_ключа_и_значения). По умолчанию используются ', ' и ': '.
import json
data = {'enabled': True, 'temperature': 23.5}
text = json.dumps(data, separators=(',', ':'))
print(text) # {"enabled":true,"temperature":23.5}
У словарей используйте строковые ключи, а при обмене со строгими JSON-системами — конечные числа вместо NaN/Infinity. Дополнительных параметров CPython, например indent, sort_keys, ensure_ascii или default, здесь нет.
dump
json.dump(obj, stream, *, separators=None)
Записывает JSON в поток, возвращает None. Подходит, например, TCP-сокет. Функция не добавляет разделитель сообщений и не закрывает поток. Два подряд записанных объекта сами по себе не образуют одно JSON-значение.
Для передачи небольшого сообщения с явным разделителем удобнее сериализовать его и отправить через sendall:
import json
# sock — уже подключённый TCP-сокет.
def send_message(sock, data):
payload = json.dumps(data, separators=(',', ':')).encode('utf-8')
sock.sendall(payload + b'\n')
TCP не сохраняет границы сообщений. Получатель должен отдельно выделить сообщение по согласованному формату, например по переводу строки или длине.
loads
json.loads(data)
Читает значение из str или байтового буфера и возвращает объект Python. JSON-массив превращается в список, объект — в словарь, null — в None, логические значения — в bool. Целые числа ограничены signed int64, как и остальные большие целые этой прошивки.
import json
value = json.loads('{"key":"value","number":42}')
assert value == {'key': 'value', 'number': 42}
Поддерживается UTF-8 и escape-последовательности \uXXXX. Корректная суррогатная пара объединяется в один символ, например U+1F600. Неполные/неверные Unicode escape и одиночные суррогаты вызывают ValueError.
import json
assert json.loads(r'"\ud83d\ude00"') == chr(0x1f600)
load
json.load(stream) читает значение из потока до его конца (EOF). Поток должен поддерживать чтение. Для TCP необходимо заранее определить границы сообщения: если партнёр не закрывает поток, вызов может продолжать ждать данные. Для уже выделенного сообщения используйте loads.
Ограничение проверки синтаксиса
Парсер намеренно упрощён и не является строгим валидатором JSON. Он допускает некоторые пропущенные разделители, незакрытые и несогласованные скобки. На контроллере подтверждено принятие следующих некорректных документов:
import json
assert json.loads('[1') == [1]
assert json.loads('{"a":1') == {'a': 1}
assert json.loads('[1}') == [1]
assert json.loads('{"a"}') == {}
Успешный loads или отсутствие ValueError не подтверждают соответствие стандарту JSON. Если требуется строгая валидация, выполняйте её отдельным средством. После разбора отдельно проверяйте ожидаемые типы, обязательные поля и диапазоны значений. Исправление Unicode не изменяет это ограничение структурного парсера.