Python JSON: кодирование, декодирование и работа с файлами — практическое руководство
Что такое JSON в Python?
JSON — сокращение от JavaScript Object Notation — наиболее широко используемый текстовый формат обмена данными. В Python он напрямую отображается на нативные структуры данных: объекты становятся dict, массивы — list, строки, числа, булевы значения и null переводятся в str, int/float, bool и None соответственно. Модуль json в стандартной библиотеке обрабатывает все преобразования.
Библиотека JSON в Python
Импортируйте модуль один раз в скрипте:
import json
Модуль предлагает четыре основных метода:
| Метод | Описание |
|---|---|
| dumps() | Преобразовать Python объект в JSON строку. |
| dump() | Записать JSON строку напрямую в файловый объект. |
| loads() | Распарсить JSON строку в Python объект. |
| load() | Прочитать и распарсить JSON файл в Python объект. |
Python в JSON (кодирование)
Кодирование — процесс преобразования типов Python в JSON. Стандартное отображение показано ниже:
| Python | JSON |
|---|---|
| dict | Object |
| list | Array |
| str/unicode | String |
| int/long | Number (int) |
| float | Number (real) |
| True | true |
| False | false |
| None | null |
Пример с json.dumps():
import json
x = {
"name": "Ken",
"age": 45,
"married": True,
"children": ("Alice", "Bob"),
"pets": ["Dog"],
"cars": [
{"model": "Audi A1", "mpg": 15.1},
{"model": "Zeep Compass", "mpg": 18.1}
]
}
# Красивая печать с сортировкой ключей
sorted_string = json.dumps(x, indent=4, sort_keys=True)
print(sorted_string)
Вывод:
{
"age": 45,
"cars": [
{ "model": "Audi A1", "mpg": 15.1 },
{ "model": "Zeep Compass", "mpg": 18.1 }
],
"children": [ "Alice", "Bob" ],
"married": true,
"name": "Ken",
"pets": [ "Dog" ]
}
Запись JSON объекта в файл проста с json.dump():
with open('json_file.json', 'w') as file_write:
json.dump(x, file_write, indent=4, sort_keys=True)
После запуска скрипта json_file.json будет содержать сериализованные данные.
JSON в Python (декодирование)
Декодирование обращает отображение, превращая JSON строку или файл обратно в нативные Python объекты. Таблица преобразования зеркалит таблицу кодирования:
| JSON | Python |
|---|---|
| Object | dict |
| Array | list |
| String | str |
| Number (int) | int |
| Number (real) | float |
| true | True |
| false | False |
| null | None |
Пример с json.loads():
import json
person_data = '{"person": {"name": "Kenn", "sex": "male", "age": 28}}'
obj = json.loads(person_data)
print(obj)
print(type(obj))
print(obj.get('person'))
Вывод:
{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}
{'name': 'Kenn', 'sex': 'male', 'age': 28}
Чтение JSON файла напрямую:
with open('json_file.json') as f:
data = json.load(f)
print(data)
Вывод:
{'name': 'Ken', 'age': 45, ...}
Компактная и красивая печать
Для сетевой передачи компактное кодирование убирает пробелы:
lst = ['a', 'b', 'c', {"4": 5, "6": 7}]
compact = json.dumps(lst, separators=(',', ':'))
print(compact)
Вывод:
["a","b","c",{"4":5,"6":7}]
Для читаемости человеком красивая печать использует отступы:
dic = {"a": 4, "b": 5}
pretty = json.dumps(dic, indent=4, separators=(',', ': '))
print(pretty)
Вывод:
{
"a": 4,
"b": 5
}
Кодирование сложных объектов
Модуль json не может сериализовать произвольные объекты. Для обработки complex числа передайте функцию default:
def complex_encode(o):
if isinstance(o, complex):
return [o.real, o.imag]
raise TypeError(f"{repr(o)} is not JSON serializable")
print(json.dumps(4 + 5j, default=complex_encode))
Вывод:
[4.0, 5.0]
Декодирование сложных объектов
Используйте object_hook для обнаружения пользовательского маркера и восстановления комплексного числа:
def is_complex(obj):
if "__complex__" in obj:
return complex(obj["real"], obj["img"])
return obj
complex_obj = json.loads('{"__complex__": true, "real": 4, "img": 5}', object_hook=is_complex)
print(complex_obj)
Вывод:
(4+5j)
Классы сериализации и десериализации
Классы JSONEncoder и JSONDecoder обеспечивают детальный контроль:
JSONEncoder.default(o)— переопределите для сериализации пользовательских объектов.JSONEncoder.encode(o)— вернуть JSON строку.JSONEncoder.iterencode(o)— итерироваться по выходной строке.JSONDecoder.decode(s)— распарсить JSON строку.JSONDecoder.raw_decode(s)— распарсить, начиная с заданного индекса.
Пример:
from json.encoder import JSONEncoder
print(JSONEncoder().encode({"colour": ["red", "yellow", "green"]}))
Получение JSON по URL
Использование requests для загрузки живого JSON фида (например, CityBike NYC):
import json, requests
response = requests.get("https://feeds.citibikenyc.com/stations/stations.json")
bike_dict = json.loads(response.text)
print(bike_dict['stationBeanList'][0])
Вывод:
{ 'id': 487, 'stationName': 'E 20 St & FDR Drive', 'availableDocks': 24, ... }
Обработка исключений JSON
Основное исключение — json.JSONDecodeError, подкласс ValueError. Пример обработки:
try:
with open('bad.json') as f:
data = json.load(f)
except json.JSONDecodeError as e:
print(f"Bad JSON: {e}")
Специальные числовые значения
RFC 8259 не допускает Infinity или NaN, но Python энкодер представляет их как строки:
print(json.dumps(float('inf')))
print(json.dumps(float('nan')))
Вывод:
Infinity NaN
Повторяющиеся ключи в JSON
Когда ключ встречается несколько раз, Python json.loads() сохраняет только последнее вхождение:
json.loads('{"a": 1, "a": 2, "a": 3}') # -> {'a': 3}
Инструменты командной строки
Модуль json.tool форматирует и валидирует JSON из командной строки:
$ echo '{"name": "Kings Arthur"}' | python3 -m json.tool
{ "name": "Kings Arthur" }
Преимущества JSON в Python
- Нативная поддержка через модуль
json. - Читаемый человеком с красивой печатью.
- Широко принят для API, конфигурации и хранения данных.
- Независим от языка и лёгок.
Ограничения
- Не поддерживает пользовательские типы данных без кастомного энкодера.
- Максимальная глубина рекурсии ограничивает глубоко вложенные структуры.
- Большие документы могут быть интенсивными по памяти при полной загрузке.
Шпаргалка по Python JSON
| Функция | Описание |
|---|---|
| json.dumps(obj) | Сериализовать Python объект в JSON строку. |
| json.dump(obj, file) | Записать JSON строку в файл. |
| json.dumps(obj, separators=(",", ":")) | Компактное представление без пробелов. |
| json.dumps(obj, indent=4) | Красивый JSON с отступами. |
| json.dumps(obj, sort_keys=True) | Сортировка ключей словаря по алфавиту. |
| json.dumps(obj, default=custom) | Кодирование неподдерживаемых объектов. |
| JSONEncoder().encode(obj) | Ручная сериализация через класс энкодера. |
| json.loads(s) | Распарсить JSON строку в Python объект. |
| json.loads(s, object_hook=custom) | Кастомная логика десериализации. |
| JSONDecoder().decode(s) | Ручная десериализация через класс декодера. |
Python
- Освоение типов данных в Python: практическое руководство
- Мастерство операторов Python: Полное руководство
- Мастерство цикла while в Python: Синтаксис, примеры и лучшие практики
- Оператор pass в Python: практическое руководство
- Аргументы функций в Python: позиционные, именованные и параметры по умолчанию
- Словари в Python: создание, манипуляции и продвинутые техники
- Работа с файлами в Python: открытие, чтение, запись и управление
- Чтение файлов в Java с BufferedReader — Практическое руководство с примерами
- Проверка существования файлов и директорий в Python — практическое руководство
- Ввод-вывод файлов в Python: полное руководство по операциям I/O