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"]}
Отображение таково:
Всё, что выходит за пределы этого набора (пользовательский класс, буфер 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 на месте внутри файла обычно создаёт больше ошибок, чем избавляет от них.