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"]}

Відображення таке:

  • 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 безпосередньо всередині файлу зазвичай створюють більше помилок, ніж економлять.