Работа с JSON-файлами
Формат JSON (от англ. JavaScript Object Notation – нотация объектов JavaScript) – это текстовый формат, который чаще всего используется для обмена данными в современных информационных системах.
JSON был создан как способ представления структур данных в JavaScript, но быстро стал популярным благодаря своей простоте, читаемости и лёгкой интеграции практически с любым языком программирования.
Особенности JSON-файлов
JSON оперирует двумя основными структурами, которые напрямую соответствуют основным коллекциям Python: объектами и массивами.
Объекты (англ. objects) представляют собой неупорядоченный набор пар «ключ: значение» и соответствуют словарям в Python:
{
"Фамилия": "Блок",
"Имя": "Александр",
"Отчество": "Александрович"
}
При этом ключи в объектах JSON всегда должны быть строками, заключенными в двойные кавычки.
Массивы (англ. arrays) являются упорядоченными списками значений, то есть соответствуют обычным спискам в Python:
[
"Светское общество",
"Лишний человек",
"Дружба"
]
Также JSON позволяет работать не только со словарями и списками, но также со строками, числами, логическим и пустым типами.
|
Тип данных в JSON |
Тип данных в Python |
Особенности |
Пример |
|---|---|---|---|
|
Объект |
|
Ключами могут быть только строки |
|
|
Массив |
|
Упорядоченный список значений |
|
|
Строка |
|
Последовательность символов всегда заключается в двойные кавычки |
|
|
Число |
|
Целые и вещественные числа |
|
|
Логический тип |
|
Логические значения пишутся строчными буквами: |
|
|
Пустой тип |
|
Пустое значение пишется строчными буквами: |
|
Для удобства чтения и легкого отслеживания пар «ключ-значение» в JSON-файле принято располагать каждый элемент (пару ключ-значение в объекте или элемент в массиве) на отдельной строке с использованием отступов. Рекомендуется использовать 2 или 4 пробела. Но с точки зрения компьютера переносы строк и отступы не являются обязательной частью структуры.
Теоретически вложенность объектов и массивов в формате JSON не ограничена и объект может содержать массив, который содержит объект и так далее, однако на практике вложенность редко превышает 3-5 уровней.
Давайте рассмотрим пример JSON-файла, содержащего информацию о книгах в библиотеке:
[
{
"ID": "401",
"Название": "Двенадцать",
"Автор": {
"Фамилия": "Блок",
"Имя": "Александр",
"Отчество": "Александрович"
},
"Год_публикации": 1918,
"Жанр": "Поэма",
"Ключевые_слова": [
"Революция",
"Петербург",
"Символизм"
]
},
{
"ID": "402",
"Название": "Мцыри",
"Автор": {
"Фамилия": "Лермонтов",
"Имя": "Михаил",
"Отчество": "Юрьевич"
},
"Год_публикации": 1840,
"Жанр": "Поэма",
"Ключевые_слова": [
"Романтизм",
"Свобода",
"Исповедь"
]
},
{
"ID": "403",
"Название": "Евгений Онегин",
"Автор": {
"Фамилия": "Пушкин",
"Имя": "Александр",
"Отчество": "Сергеевич"
},
"Год_публикации": 1833,
"Жанр": "Роман в стихах",
"Ключевые_слова": [
"Светское общество",
"Лишний человек",
"Дружба"
]
}
]
Весь файл начинается и заканчивается квадратными скобками, что означает массив записей о книгах. Элементы в массиве разделяются запятыми. Каждый элемент внутри основного массива является объектом, описывающим одно произведение. При этом ключ "Автор" имеет в качестве значения не просто строку, а другой объект, а значением ключа "Ключевые_слова" является другой массив.
JSON и API
Чтобы понять, почему JSON так важен, необходимо разобраться в том, что такое API.
API (от англ. Application Programming Interface – интерфейс программирования приложения) – это набор правил и протоколов, который позволяет одной программе (клиенту) запрашивать данные или услуги у другой программы (сервера), не зная, как та программа работает внутри.
API похож на официанта в ресторане, где вы (клиент) не знаете как устроена кухня (сервер), но делаете заказ (отправляете запрос API) через официанта. Он передаёт заказ на кухню, которая готовит блюдо (генерирует данные по запросу), после чего официант приносит вам готовое блюдо (сервер отправляет ответ с данными).
Когда программа-клиент запрашивает у сервера, например, список последних новостей или погоду в городе, сервер должен вернуть эти данные в общепонятном и структурированном виде. Наиболее подходящим форматом для этого является JSON, поскольку он одновременно легко читается человеком и обрабатывается компьютером.
Модуль json
Стандартная библиотека Python имеет встроенный модуль json для работы с JSON-файлами. Операции чтения и записи в нём данных делятся по принципу: работаем мы с файлом на диске или с текстовой строкой в памяти. При этом преобразование объектов и структур данных в строку JSON называется сериализацией, а обратный процесс, при котором строка JSON преобразуется обратно в объекты и структуры данных, называют десериализацией.
Перед началом работы модуль json следует импортировать:
import json
Чтение и запись JSON-файлов
Если у вас уже есть JSON-файл, который нужно прочитать, то для этого в модуле json представлен метод json.load(), а для записи данных в новый или существующий JSON-файл существует метод json.dump().
Чтение JSON-файла
Давайте создадим простой файл food.json c данными, которые через API может возвращать сервис заказа продуктов питания:
[
{
"ID": "p001",
"Название": "Молоко цельное 3.2%",
"Категория": "Молочные продукты",
"Цена_руб": 85.50
},
{
"ID": "p002",
"Название": "Хлеб Бородинский",
"Категория": "Хлебобулочные изделия",
"Цена_руб": 60.00
},
{
"ID": "p003",
"Название": "Батон",
"Категория": "Хлебобулочные изделия",
"Цена_руб": 79.00
}
]
Для того, чтобы прочитать JSON-файл, предназначена функция json.load(), которая считывает его содержимое как список или словарь Python.
|
Функция |
|
|
Описание |
Считывает всё содержимое в JSON-файле |
|
Параметры |
|
|
Возвращаемое значение |
Список или словарь |
Ей достаточно передать файл, открытый в одном из режимов чтения, после чего она считывает весь поток символов из файла, анализирует его структуру, проверяет синтаксис JSON и строит в памяти соответствующий объект Python:
with open("food.json", "r", encoding="utf-8") as food_file:
food_lst = json.load(food_file)
for food in food_lst:
print(food["Название"])
# Вывод: Молоко цельное 3.2%
# Вывод: Хлеб Бородинский
# Вывод: Батон
Функция json.load() возвращает список или словарь, с которым можно работать как с любым объектом в Python, например, перебирать в цикле for или обращаться по ключу.
Это позволяет удобно обрабатывать данные, полученные из внешних источников, без необходимости вручную разбирать текст файла. Соответствие структуры JSON структурам данным в Python делает работу с такими файлами наглядной и предсказуемой.
Запись в JSON-файл
Списки и словари в Python можно записать в JSON-файл с помощью функции json.dump().
|
Функция |
|
|
Описание |
Записывает список или словарь |
|
Параметры |
Необязательные параметры:
|
|
Возвращаемое значение |
|
По умолчанию функция json.dump() записывает все не-ASCII символы, такие как русские буквы, используя Юникод-экранирование. Например, русская буква «д» имеет код U+0434 и будет записана в JSON-файл как \u0434. Для того, чтобы сохранить кириллицу в читаемом виде, следует передать функции аргумент ensure_ascii=False.
Также если не задать количество отступов с помощью параметра indent, то функция json.dump() запишет данные в одну строку. Это не очень удобно для чтения, поэтому рекомендуется использовать 2 или 4 отступа, что не влияет на структуру данных, а изменяет только внешний вид JSON-файла:
meeting_data = {
"ID_События": 101,
"Дата": "2025-11-25",
"Время_начала": "14:00",
"Время_окончания": "15:30",
"Название": "Встреча с отделом продаж",
"Статус": "Подтверждено",
"Участники": ["Большой босс", "Средний босс", "Маленький босс"]
}
with open("meeting.json", "w+", encoding="utf-8") as meeting:
json.dump(meeting_data, meeting, indent=2, ensure_ascii=False)
# Читаем записанные данные
meeting.seek(0)
data = json.load(meeting)
print(data["Участники"])
# Вывод: ['Большой босс', 'Средний босс', 'Маленький босс']
Работа со строками
Модуль json позволяет работать не только с JSON-файлами, но и с обычными строками в формате JSON. Для этого предназначены функции json.loads(), которая преобразует строку в JSON-формате в объект Python, и функция json.dumps(), которая наоборот, преобразует объект Python в такую строку.
Названия эти функций отличаются от функций работы с JSON-файлами только буквой «s» (от англ. string – строка) на конце, так как они выполняют ту же самую работу, но в качестве носителя данных используют не файл, а обычную строку в оперативной памяти.
Преобразование строки в формате JSON в объект Python
Чаще всего ответ, полученный через API, представлен в виде обычной строки Python, и для того, чтобы обращаться к её элементам по ключу или по индексу, такую строку необходимо преобразовать в словарь или список с помощью функции json.loads().
|
Функция |
|
|
Описание |
Преобразует строку в JSON-формате |
|
Параметры |
|
|
Возвращаемое значение |
Список или словарь |
Эта функция выполняет синтаксический анализ переданной ей строки и возвращает объект Python:
json_string = '{"Город": "Череповец", "Координаты": {"Широта": 59.1333, "Долгота": 37.9000}}'
city = json.loads(json_string)
print(city["Город"])
# Вывод: Череповец
Главное отличие функции json.loads() от функции json.load() заключается в том, что она работает исключительно со строками в памяти и не взаимодействует с файловой системой.
Преобразование в строку в формате JSON
Как строку в формате JSON можно преобразовать в объект Python, так и наоборот список или словарь можно преобразовать в строку в этом формате с помощью функции json.dumps().
|
Функция |
|
|
Описание |
Преобразует список или словарь |
|
Параметры |
Необязательные параметры:
|
|
Возвращаемое значение |
Строка |
Она принимает такие же параметры как и функция json.dump(), то есть для работы с кириллицей ей нужно запретить Юникод-экранирование с помощью аргумента ensure_ascii=False и задать количество отступов indent для читаемого вида:
user_info = {"ID": 105, "Активен": False, "Роль": "Гость", "Язык": "Рус-ский"}
json_user_info = json.dumps(user_info, ensure_ascii=False, indent=2)
print(json_user_info)
# Вывод: {
# "ID": 105,
# "Активен": false,
# "Роль": "Гость",
# "Язык": "Русский"
# }
print(type(json_user_info))
# Вывод: <class "str">
Это позволяет получить красиво форматированную строку для вывода на экран или логирования.
Примеры
Пример 1. Получение данных о местоположении пользователя
Геокодирующий сервис определяет местоположение пользователя по IP и возвращает его в виде следующего JSON-файла:
{
"status": "success",
"queryTime": "2025-11-30T14:30:00Z",
"address": {
"country": "Россия",
"city": "Москва",
"coordinates": {
"lat": 55.7558,
"lon": 37.6173
},
"street": "Тверская ул."
},
"ip": "8.8.8.8"
}
Программа открывает этот файл и извлекает из него нужные данные:
import json
with open("geoip_response.json", "r", encoding="utf-8") as response:
response_data = json.load(response)
city = response_data["address"]["city"]
latitude = response_data["address"]["coordinates"]["lat"]
status = response_data.get("status", "error")
print(f"Статус запроса: {status}")
print(f"Город: {city}")
print(f"Координаты: Широта {latitude}")
Вывод:
Статус запроса: success
Город: Москва
Координаты: Широта 55.7558
Пример 2. Создание файла с настройками
Настройки приложения хранятся в словаре config_data, однако настройки часто редактируются вручную системными администраторами или пользователями, поэтому этот словарь записывается в файл app_config.json:
import json
config_data = {
"database": {
"host": "localhost",
"port": 5432,
"user": "admin_user"
},
"logging": {
"level": "INFO",
"destination": "/var/log/app.log",
"language": "Русский"
},
"max_threads": 8
}
with open("app_config.json", "w+", encoding="utf-8") as config:
json.dump(config_data, config, indent=2, ensure_ascii=False)
config.seek(0)
print(config.read())
Вывод:
{
"database": {
"host": "localhost",
"port": 5432,
"user": "admin_user"
},
"logging": {
"level": "INFO",
"destination": "/var/log/app.log",
"language": "Русский"
},
"max_threads": 8
}
Пример 3. Преобразование JSON в CSV
В системе данные о статусе проекта и ответственном менеджере хранятся в файле projects.json с примерно следующим содержанием:
[
{
"id": 1,
"name": "Мобильное приложение",
"manager": "Ломоносов М.В.",
"status": "Активный"
},
{
"id": 2,
"name": "Обновление сервера",
"manager": "Романов П.А.",
"status": "Завершённый"
},
{
"id": 3,
"name": "Внедрение CRM",
"manager": "Курчатов И.В.",
"status": "Активный"
}
]
Хотя JSON является стандартом для передачи данных, но CSV до сих пор необходим для простой аналитики или загрузки в Excel. Поэтому данные из этого файла читаются, обрабатываются и записываются в CSV-файл.
Для этого в контекстном менеджере одновременно открывается оба файла:
import json
import csv
with open("projects.json", "r", encoding="utf-8") as infile, \
open("projects_report.csv", "w", newline="", encoding="utf-8") as outfile:
# Загружаем данные JSON
projects = json.load(infile)
# Создаём объект записи CSV
csv_writer = csv.writer(outfile)
# Заголовки для CSV (выбираем только нужные поля)
csv_headers = ["ID", "Название", "Менеджер"]
csv_writer.writerow(csv_headers)
# Записываем данные из JSON в CSV
for project in projects:
# Выбираем и записываем только активные проекты
if project["status"] == "Активный":
row = [
project["id"],
project["name"],
project["manager"]
]
csv_writer.writerow(row)
print(f"Экспортирован проект: {project['name']}")
else:
print(f"Пропущен проект: {project['name']} (Статус: {pro-ject['status']})")
Содержимое файла projects_report.csv:
ID,Название,Менеджер
1,Мобильное приложение,Ломоносов М.В.
3,Внедрение CRM,Курчатов И.В.
Итоги
- JSON-файл – это файл с расширением
.json, который чаще всего используется для обмена данными. - JSON основан на объектах (словарях) и массивах (списках).
- Модуль
jsonпредоставляет инструменты для работы с JSON-файлами. - Прочитать JSON-файл позволяет функция
json.load(), а записать в него данные – функцияjson.dump(). - Преобразовать строку в JSON-формате в объект Python позволяет функция
json.loads(), а объект Python в такую строку – функцияjson.dumps().
Задания для самопроверки
1. Назовите две основные структуры данных в JSON и укажите, каким типам данных Python они соответствуют.
Объекты соответствуют словарям, а массивы – спискам.
2. В чем состоит отличие между парой функций json.load() и json.dump() и парой функций json.loads() и json.dumps()?
Функции json.load() и json.dump() предназначены для работы с JSON-файлами, а функции json.loads() и json.dumps() – для работы со строками в JSON-формате.
3. Создайте новый файл user.json и запишите в него словарь user_data = { "id": 1, "username": "coder_pro", "active": True }.
import json
with open("user.json", "w", encoding="utf-8") as f:
user_data = {"id": 1, "username": "coder_pro", "active": True}
json.dump(user_data, f, indent=2)
4. Откройте файл user.json из предыдущего задания, прочитайте его содержимое и выведите на экран значение ключа "username".
import json
with open("user.json", 'r', encoding='utf-8') as f:
read_user_data = json.load(f)
username = read_user_data.get("username")
print(username)
# Вывод: coder_pro
5. Дан список books = [{"title": "Преступление и наказание", "year": 1866}, {"title": "Война и мир", "year": 1869}]. Преобразуйте его в строку в JSON-формате, проверьте её на принадлежности типу строк (str) и выведите результат на экран.
import json
books = [
{"title": "Преступление и наказание", "year": 1866},
{"title": "Война и мир", "year": 1869}
]
json_string = json.dumps(books, ensure_ascii=False)
is_string = isinstance(json_string, str)
print(is_string)
# Вывод: True
0 комментариев