2.1 Модуль json
JSON (JavaScript Object Notation) — это легкий формат обмена данными, который легко читается и пишется человеком, а также легко анализируется и генерируется компьютером. JSON часто используется для передачи данных между сервером и веб-приложением, а также для хранения конфигураций и настроек.
Модуль json в Python предоставляет функции для сериализации (преобразования объектов Python в строки JSON) и десериализации (преобразования строк JSON в объекты Python). Этот модуль встроен в стандартную библиотеку Python и активно используется для работы с JSON-данными.
Основные функции модуля json очень напоминают таковые у pickle и работают аналогично. А что вы хотите — стандарт!
- Работа со строками:
-
json.dumps(obj)— Преобразует объект Python в строку JSON. -
json.loads(s)— Преобразует строку JSON в объект Python.
-
- Работа с файлами:
-
json.dump(obj, file)— Сериализует объект Python и записывает его в текстовый файл. -
json.load(file)— Десериализует объект Python из текстового файла, содержащего данные в формате JSON.
-
Давайте разберем пару примеров, чтобы лучше запомнить работу этих функций.
2.2 Сериализация в строку
Сериализация объектов Python в строки JSON
Для сериализации объекта в строку нужно просто передать его в функцию json.dumps().
import json
# Пример объекта для сериализации
data = {
"name": "Alice",
"age": 30,
"is_student": False,
"courses": ["Math", "Science"],
"address": {
"city": "New York",
"zip_code": "10001"
}
}
# Преобразование объекта Python в строку JSON
json_string = json.dumps(data, indent=4)
print("Сериализованные данные (JSON):", json_string)
Десериализация строк JSON в объекты Python
Для получения объекта из строки нужно просто передать JSON-строку, содержащую описание объекта, в метод json.loads().
import json
# Пример строки JSON для десериализации
json_string = ''' { "name": "Alice", "age": 30, "is_student": false, "courses": ["Math", "Science"], "address": { "city": "New York", "zip_code": "10001" } } '''
# Преобразование строки JSON в объект Python
data = json.loads(json_string)
print("Десериализованные данные (Python):", data)
2.3 Сериализация в файл
Запись объектов Python в файл в формате JSON
Для записи объекта в файл нужно вызвать метод json.dump(). При работе с файлами важно использовать обработку исключений, чтобы корректно обрабатывать возможные ошибки. Вот пример:
import json
# Пример объекта для сериализации
data = {
"name": "Bob",
"age": 25,
"is_student": True,
"courses": ["History", "Literature"],
"address": {
"city": "Los Angeles",
"zip_code": "90001"
}
}
# Запись объекта Python в файл JSON с обработкой исключений
try:
with open('data.json', 'w') as file:
json.dump(data, file, indent=4)
print("Данные успешно записаны в файл.")
except IOError:
print("Ошибка при записи в файл.")
except json.JSONEncodeError:
print("Ошибка при кодировании JSON.")
Чтение объектов Python из файла в формате JSON
Чтение тоже очень простое — просто передаем файл в метод json.load(). Здесь также важно использовать обработку исключений:
import json
# Чтение объекта Python из файла JSON с обработкой исключений
try:
with open('data.json', 'r') as file:
data = json.load(file)
print("Десериализованные данные из файла (Python):", data)
except IOError:
print("Ошибка при чтении файла.")
except json.JSONDecodeError:
print("Ошибка при декодировании JSON.")
2.4 Дополнительные параметры функций
В функцию, которая занимается сериализацией, можно передать дополнительные параметры, которые сделают ваш JSON красивее:
-
skipkeys: ЕслиTrue, то пропускает ключи, которые не являются строками, числами илиNone. -
ensure_ascii: ЕслиTrue, все не-ASCII символы будут экранированы с помощью Unicode escape sequences. -
indent: Если указано число, отступы будут добавлены для лучшей читаемости. -
sort_keys: ЕслиTrue, ключи в JSON будут отсортированы по алфавиту.
Пример использования параметров json.dumps():
import json
data = {"c": 3, "b": 2, "a": 1}
# Сериализация с сортировкой ключей и отступами
json_string = json.dumps(data, indent=4, sort_keys=True)
print(json_string)
2.5 Пользовательские декодеры и кодеры
Модуль json позволяет использовать пользовательские функции для сериализации и десериализации объектов.
Пример пользовательского кодера
Сначала мы создаем специальный класс-кодировщик, который внутри себя проверяет, что если тип объекта == datetime, то возвращает объект как строку ISO-формата.
import json
from datetime import datetime
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime): return obj.isoformat()
return super().default(obj)
data = {
"name": "Alice",
"timestamp": datetime.now()
}
# Сериализация с пользовательским кодером
json_string = json.dumps(data, cls=CustomEncoder, indent=4)
print(json_string)
Пример пользовательского декодера
Для обратной операции нам тоже нужна функция, которая преобразовывает строку в дату. Например, можно просто проверить имя поля, и если оно называется timestamp, то преобразовать строку в объект datetime:
import json
from datetime import datetime
def custom_decoder(dct):
if 'timestamp' in dct: dct['timestamp'] = datetime.fromisoformat(dct['timestamp'])
return dct
json_string = '''
{
"name": "Alice",
"timestamp": "2023-05-15T14:30:00"
}
'''
# Десериализация с пользовательским декодером
data = json.loads(json_string, object_hook=custom_decoder)
print(data)
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ