2.28. JSON

JSON (JavaScript Object Notation) – это компактный, удобочитаемый текстовый формат для структурированных данных. Он определяет шесть типов – string, number, boolean, null, array и object – каждый из которых напрямую отображается на значение Python, так что преобразование между Python и JSON в любом направлении – это единственный вызов функции.

JSON – это лингва франка файлов конфигурации и веб-API. Используйте его всякий раз, когда нужно сохранить небольшой набор настроек на диск в форме, которую вы также можете прочитать глазами, или обменяться структурированными данными с другой программой.

Две функции покрывают большинство потребностей:

  • json.dumps()dump string: превратить значение Python в строку JSON.

  • json.loads()load string: разобрать строку JSON обратно в Python.

Пара json.dump / json.load (без s) выполняет ту же работу, но принимает файловый объект напрямую.

2.28.1. Кодирование (dumps)

import json

config = {
    "name":  "OpenMV",
    "width": 320,
    "tags":  ["red", "round"],
}

text = json.dumps(config)
print(text)

Вывод:

{"name": "OpenMV", "width": 320, "tags": ["red", "round"]}

Отображение таково:

  • dict (строковые ключи) → объект JSON.

  • list и tuple → массив JSON.

  • str → строка JSON.

  • int, float → число JSON.

  • True, False, Nonetrue, false, null.

Всё, что выходит за пределы этого набора (пользовательский класс, буфер bytes, set), возбуждает TypeError. Сначала преобразуйте значение.

Примечание

json.dumps() в CPython принимает аргумент indent для красиво отформатированного вывода; в MicroPython его нет. Единственный регулятор форматирования – separators, который управляет внутристрочными отступами – передайте (',', ':') для самой компактной формы. Многострочный вывод с отступами при необходимости приходится формировать вручную.

2.28.2. Декодирование (loads)

text = '{"name": "OpenMV", "width": 320}'
config = json.loads(text)
print(config["name"], config["width"])

Вывод:

OpenMV 320

Объекты JSON становятся dict, массивы становятся list, а остальное отображается обратно на свои эквиваленты в Python. Некорректный JSON возбуждает ValueError.

2.28.3. Чтение и запись файлов

Файловая пара хорошо сочетается с with:

import json

with open("config.json") as f:
    config = json.load(f)

config["width"] = 640

with open("config.json", "w") as f:
    json.dump(config, f)

Относитесь к файлу JSON как к целостной записи – прочитайте его, измените значение Python, запишите обратно. Попытка редактировать JSON на месте внутри файла обычно создаёт больше ошибок, чем избавляет от них.