Модуль 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 не изменяет это ограничение структурного парсера.