JSON (JavaScript Object Notation) — это популярный упрощенный стандарт обмена данными. Он представляет структуры данных, состоящие из пар ключ-значение, которые довольно просты и удобочитаемы.
Формат JSON стал отраслевым стандартом для обмена данными между онлайн-сервисами. И он широко используется во всех современных языках программирования, включая Python.
Скачивайте книги ТОЛЬКО на русском языке у нас в телеграм канале: PythonBooksRU
Данные JSON часто выражаются в виде вложенных словарей, списков и скалярных значений, таких как текстовые данные, числа и логические значения. Этот формат называется JSON, так как он точно имитирует синтаксис, используемый в объектах JavaScript.
В данной статье мы изучим модуль json в Python и узнаем, как с его помощью эффективно работать с данными.
Встроенный в Python модуль json
JSON играет важную роль в программировании на Python, поскольку он обеспечивает эффективную сериализацию и десериализацию данных. Он позволяет программам на Python легко взаимодействовать с веб-сервисами, обмениваться данными и хранить структурированную информацию.
Разработчики могут использовать JSON, чтобы легко связать свои программы, написанные на Python, с различными API, базами данных и внешними системами, которые используют JSON для представления данных.
Встроенный в Python модуль json предоставляет мощный набор методов и классов, упрощающих работу с данными JSON. Разработчики могут использовать его для кодирования объектов Python в строки JSON и декодирования строк JSON обратно в объекты Python.
Как сохранить данные JSON в файл
При работе с данными JSON в Python вам часто нужно сохранять данные или делиться ими с другими. Хранение данных JSON в файлах обеспечивает их быстрый поиск и сохранность.
В этом разделе вы узнаете, как использовать функцию Python json.dump()
для сохранения данных JSON в файл. Этот процесс включает в себя сериализацию данных JSON и их сохранение в файл, который впоследствии можно прочитать и использовать по мере надобности.
Функция json.dump()
Функция json.dump()
в Python позволяет хранить данные JSON непосредственно в файле. Она принимает два параметра: данные, которые нужно сериализовать, и файловый объект, в который будут записываться данные.
Чтобы записать данные JSON в файл, вам нужно выполнить несколько определенных шагов. Сначала нужно открыть файл в режиме записи, указав к нему путь. Затем вы можете использовать функцию json.dump()
для сериализации данных и записи их в файл. Наконец, вам нужно закрыть файл, чтобы убедиться, что все данные правильно сохранены.
Давайте посмотрим, как сохранять данные в файле, на примере ответа от API сайта с гороскопами.
Предположим, вы сделали запрос GET-запрос по следующему URL-адресу: https://horoscope-app-api.vercel.app/api/v1/get-horoscope/daily? Данный запрос обеспечивает ежедневный гороскоп для Козерогов.
import requests import json # Make the GET request to the horoscope API response = requests.get("https://horoscope-app-api.vercel.app/api/v1/get-horoscope/daily?sign=capricorn&day=today") data = response.json() # Convert the response to JSON # Store the JSON data in a file with open("horoscope_data.json", "w") as file: json.dump(data, file) print("Data stored successfully!")
Здесь мы используем библиотеку requests, чтобы сделать GET-запрос к API сайта с гороскопами. Затем мы извлекаем данные JSON из ответа, используя метод .json()
. И наконец, мы открываем файл с именем horoscope_data.json
в режиме записи при помощи инструкции with и используем метод json.dump()
для сохранения данных в файл.
Если открыть файл horoscope_data.json, то можно увидеть примерно следующее содержимое:
{ "data": { "date": "Jun 3, 2023", "horoscope_data": "The forecast today is stormy. You may have sensed that there was some tension clouding the conversation at home. Resentments were left unsaid and subtle power games were played without resolution. Today, Capricorn, it all becomes too unbearable for you. Regardless of the risks involved, you will take measures to clear things up." }, "status": 200, "success": true }
Как получить данные из файла JSON
Довольно часто требуется извлекать данные из файлов в формате JSON. Например, в них часто хранятся параметры конфигурации. Модуль Python JSON предоставляет функцию json.load()
, которая позволяет читать и десериализовать данные JSON из файла.
Функция json.load()
Функция json.load()
принимает файловый объект в качестве аргумента и возвращает десериализованные данные JSON в виде объектов Python, таких как словари, списки, строки, числа, логические значения или значения null.
Чтобы прочитать данные JSON из файла, вам нужно открыть файл в режиме чтения, извлечь данные с помощью функции json.load()
и сохранить их в переменной для дальнейшей обработки. Важно убедиться, что считываемый файл содержит допустимые данные JSON, иначе может возникнуть исключение.
Давайте посмотрим, как можно получить данные из ранее созданного файла horoscope_data.json:
import json # Retrieve JSON data from the file with open("horoscope_data.json", "r") as file: data = json.load(file) # Access and process the retrieved JSON data date = data["data"]["date"] horoscope_data = data["data"]["horoscope_data"] # Print the retrieved data print(f"Horoscope for date {date}: {horoscope_data}")
Здесь мы открываем файл horoscope_data.json в режиме чтения с помощью оператора with
. Затем мы используем функцию json.load()
для десериализации данных JSON из файла в переменную data
. И наконец, мы получаем доступ к определенным полям данных JSON (например, date
и horoscope_data
) и обрабатываем их по мере необходимости.
Как форматировать данные JSON
Когда мы считываем данные из файла JSON и выводим их в консоль, то они отображаются в виде одной строки, что может не соответствовать структурированному формату JSON.
Например:
import json # Retrieve JSON data from the file with open("horoscope_data.json", "r") as file: data = json.load(file) print(data)
Результат:
{'data': {'date': 'Jun 3, 2023', 'horoscope_data': 'The forecast today is stormy. You may have sensed that there was some tension clouding the conversation at home. Resentments were left unsaid and subtle power games were played without resolution. Today, Capricorn, it all becomes too unbearable for you. Regardless of the risks involved, you will take measures to clear things up.'}, 'status': 200, 'success': True}
Функция json.dumps()
Для сериализации объектов Python в строку в формате JSON модуль json предлагает функцию json.dumps()
. Данная функция предоставляет различные варианты настройки, включая форматирование вывода, чтобы сделать его более удобочитаемым.
Функция json.dumps()
предоставляет несколько параметров для настройки вывода. Чаще всего используется параметр indent
, который позволяет указать количество пробелов, используемых для отступа.
import json # Retrieve JSON data from the file with open("horoscope_data.json", "r") as file: data = json.load(file) # Format the data formatted_data = json.dumps(data, indent=2) print(formatted_data)
Результат:
{ "data": { "date": "Jun 3, 2023", "horoscope_data": "The forecast today is stormy. You may have sensed that there was some tension clouding the conversation at home. Resentments were left unsaid and subtle power games were played without resolution. Today, Capricorn, it all becomes too unbearable for you. Regardless of the risks involved, you will take measures to clear things up." }, "status": 200, "success": true }
Как видите, данные JSON теперь отформатированы с правильными отступами, что повышает их удобочитаемость. Этот метод можно применять к любым данным JSON, что позволяет нам представлять выходные данные JSON более организованным и визуально привлекательным способом.
Инструмент командной строки json.tool
Модуль Python json предоставляет удобный инструмент командной строки под названием json.tool
, который позволяет нам форматировать и красиво выводить на экран данные JSON непосредственно из командной строки. Это полезный инструмент для быстрой визуализации структуры и содержимого данных JSON в более удобочитаемом и организованном формате.
Чтобы использовать json.tool
, нужно выполнить следующую команду в интерфейсе командной строки:
python -m json.tool <input_file> <output_file>
Здесь:
python -m json.tool
вызывает модуль json.tool с помощью интерпретатора Python.<input_file>
представляет путь к файлу JSON, который требуется отформатировать.<output_file>
— необязательный аргумент, указывающий файл, в который мы хотим сохранить отформатированный вывод JSON. Если этот аргумент не указан, отформатированный вывод будет отображаться на консоли.
Допустим, у нас есть файл horoscope_data.json со следующим содержимым:
{ "data": { "date": "Jun 3, 2023", "horoscope_data": "The forecast today is stormy. You may have sensed that there was some tension clouding the conversation at home. Resentments were left unsaid and subtle power games were played without resolution. Today, Capricorn, it all becomes too unbearable for you. Regardless of the risks involved, you will take measures to clear things up." }, "status": 200, "success": true }
Обратите внимание, что приведенный выше файл JSON имеет отступ в два пробела.
Чтобы красиво вывести его при помощи json.tool
, следует выполнить следующую команду:
python -m json.tool horoscope_data.json
Результат будет иметь следующий вид:
{ "data": { "date": "Jun 3, 2023", "horoscope_data": "The forecast today is stormy. You may have sensed that there was some tension clouding the conversation at home. Resentments were left unsaid and subtle power games were played without resolution. Today, Capricorn, it all becomes too unbearable for you. Regardless of the risks involved, you will take measures to clear things up." }, "status": 200, "success": true }
Как видно из данного примера, выполнение метода json.tool
с путем к входному файлу форматирует данные JSON и отображает отформатированный вывод на консоли.
Также можно перенаправить отформатированный вывод в выходной файл, указав его имя в качестве второго аргумента:
python -m json.tool horoscope_data.json formatted_data.json
Эта команда форматирует данные JSON из horoscope_data.json и сохраняет их файл под названием formatted_data.json.
JSON-кодирование пользовательских объектов
Модуль json в Python позволяет кодировать и декодировать пользовательские объекты с помощью специальных классов модуля. Эти классы дают возможность определить пользовательскую логику сериализации и десериализации для ваших объектов.
Класс JSONEncoder
позволяет настроить процесс кодирования. Чтобы определить, как пользовательский объект должен быть закодирован в формате JSON, можно расширить JSONEncoder
и изменить его метод default
.
Вот пример того, как можно расширить класс JSONEncoder и настроить процесс кодирования для пользовательского объекта:
import json class Person: def __init__(self, name, age): self.name = name self.age = age class PersonEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, Person): return {"name": obj.name, "age": obj.age} return super().default(obj) # Create a custom object person = Person("Ashutosh Krishna", 23) # Encode the custom object using the custom encoder json_str = json.dumps(person, cls=PersonEncoder) # Print the encoded JSON string print(json_str)
В этом примере определяется пользовательский класс Person
с атрибутами имени и возраста. Затем создается подкласс JSONEncoder
с именем PersonEncoder
и переопределяется его метод default
.
В методе default
проверяется, является ли кодируемый объект экземпляром класса Person
. Если это так, создается JSON-сериализуемое представление объекта и метод возвращает словарь, содержащий атрибуты имени и возраста. В противном случае вызывается метод default
суперкласса.
Используя метод json.dumps
и указав параметр cls
в качестве пользовательского класса кодировщика PersonEncoder
, можно закодировать объект Person
в строку JSON. Результат будет иметь следующий вид:
{"name": "Ashutosh Krishna", "age": 23}
Точно так же можно указать пользовательскую логику декодирования в классе декодера JSONDecoder
модуля json. Чтобы определить, как данные JSON должны быть декодированы в пользовательский объект, расширьте класс JSONDecoder
и переопределите его функцию object_hook
.
Как создать объект JSON из словаря Python
Для создания объекта JSON из словаря Python можно использовать функцию json.dumps()
. Эта функция берет объект Python, как правило словарь, и преобразует его в строковое представление JSON.
import json # Python dictionary data = { "name": "Ashutosh Krishna", "age": 23, "email": "ashutosh@example.com" } # Convert dictionary to JSON string json_str = json.dumps(data) # Print the JSON string print(json_str)
В этом примере на вход подается словарь Python с некоторыми данными. Вызывая метод json.dumps(data)
, мы конвертируем словарь в строку JSON. Результат будет иметь следующий вид:
{"name": "Ashutosh Krishna", "age": 23, "email": "ashutosh@example.com"}
Как создать словарь Python из объекта JSON
Чтобы создать словарь Python из данных JSON, можно использовать функцию json.loads()
. Эта функция берет строку JSON и преобразует ее в соответствующий объект Python, по умолчанию в словарь.
import json # JSON string json_str = '{"name": "Ashutosh Krishna", "age": 23, "email": "ashutosh@example.com"}' # Convert JSON string to Python dictionary data = json.loads(json_str) # Access the dictionary values print(data["name"]) print(data["age"]) print(data["email"])
В этом примере у нас есть строка JSON, хранящая в переменной json_str
некоторые данные. Вызывая метод json.loads(json_str)
, мы конвертируем строку JSON в словарь Python. Затем можно получить доступ к значениям в словаре, используя соответствующие ключи.
Результат будет иметь вот такой вид:
Ashutosh Krishna 23 ashutosh@example.com
Заключение
Для работы с данными JSON необходимо хорошо понимать соответствующий модуль json языка Python, поскольку он широко используется для обмена данными и их хранения в различных приложениях.
Если освоить этот модуль, вы сможете эффективно обрабатывать данные JSON, взаимодействовать с различными API и работать с файлами конфигураций.
Перевод статьи Ashutosh Krishna How to Use the JSON Module in Python – A Beginner’s Guide.