2.28. JSON¶
JSON (JavaScript Object Notation) – це компактний, зручний для читання текстовий формат для структурованих даних. Він визначає шість типів – рядок, число, булеве значення, null, масив та об’єкт – кожен з яких безпосередньо відображається на значення Python, тому перетворення між Python та JSON – це один виклик функції в будь-якому напрямку.
JSON є lingua franca конфігураційних файлів та вебінтерфейсів. Використовуйте його, коли потрібно зберегти невеликий набір налаштувань на диск у формі, яку також можна прочитати очима, або для обміну структурованими даними з іншою програмою.
Дві функції покривають більшість потреб:
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 безпосередньо всередині файлу зазвичай створюють більше помилок, ніж економлять.