Введение
JSON (JavaScript Object Notation) - популярный формат данных для хранения данных в сериализованном и читаемом человеком виде. Он широко используется для передачи данных между сервером и веб-приложением и также является отличным выбором для хранения данных в NoSQL-бази данных. В Python мы можем использовать модуль json для работы с данными JSON.
Достижения
- Чтение и запись JSON-файлов
- Сериализация и десериализация JSON-данных
Введение в JSON
JSON (JavaScript Object Notation) - легковесный формат обмена данными, который легко читается и записывается человеком и легко разбирается и генерируется машинами. Он основан на подмножестве языка программирования JavaScript, стандарта ECMA-262 3rd Edition - декабрь 1999 года. JSON - это текстовый формат, который полностью независим от языка, но использует соглашения, знакомые программистам языков из семейства C, включая C, C++, C#, Java, JavaScript, Perl, Python и многие другие. Эти свойства делают JSON идеальным языком обмена данными.
Базовая структура JSON состоит из объектов, которые представляют собой коллекции пар ключ-значение, и массивов, которые представляют собой упорядоченные списки значений.
Вот пример JSON-объекта:
{
"name": "Alice",
"age": 26,
"city": "New York"
}
В этом JSON-объекте есть три пары ключ-значение:
- "name" : "Alice"
- "age" : 26
- "city" : "New York"
Вот пример JSON-массива:
["apple", "banana", "cherry"]
В этом JSON-массиве есть три значения: "apple", "banana" и "cherry".
JSON-объект может содержать несколько пар ключ-значение и массивов, а JSON-массив может содержать несколько объектов и массивов. Вот пример более сложной структуры JSON:
{
"employees": [
{ "firstName": "John", "lastName": "Doe" },
{ "firstName": "Anna", "lastName": "Smith" },
{ "firstName": "Peter", "lastName": "Jones" }
],
"owners": [
{ "name": "Alice", "age": 30 },
{ "name": "Bob", "age": 35 }
],
"office": {
"name": "Acme Inc.",
"location": "New York"
}
}
В этом JSON-объекте есть три пары ключ-значение:
- "employees" : массив объектов сотрудников
- "owners" : массив объектов владельцев
- "office" : объект офиса
Модуль json
Для разбора JSON-объекта в Python мы можем использовать модуль json. Модуль json является частью стандартной библиотеки Python, поэтому его не нужно устанавливать отдельно.
Откройте новую сессию интерпретатора Python и введите следующий код:
python3
Вот пример того, как разобрать JSON-объект из предыдущего примера:
import json
json_strings = '{"employees": [{ "firstName": "John", "lastName": "Doe"}, ], "owners": [{ "name": "Alice", "age": 30 }, { "name": "Bob", "age": 35 }], "office": {"name": "Acme Inc."}}'
## Разбор JSON-объекта
data = json.loads(json_strings)
## Доступ к данным
employees = data['employees']
owners = data['owners']
office = data['office']
## Печать данных
print(employees)
print(owners)
print(office)
Это выведет следующее:
[{'firstName': 'John', 'lastName': 'Doe'}]
[{'name': 'Alice', 'age': 30}, { "name": "Bob", "age": 35 }]
{'name': 'Acme Inc.'}
Затем вы можете получать доступ к данным в JSON-объекте с использованием ключей и индексов, так же, как это делается с Python-словарем или списком. Например, чтобы получить имя первого сотрудника, вы можете использовать следующий код:
first_employee = employees[0]
first_name = first_employee['firstName']
print(first_name)
Это выведет следующее:
John
Вы также можете пройти по массивам и получить доступ к данным для каждого элемента. Например, чтобы вывести имя и возраст каждого владельца, вы можете использовать следующий код:
for owner in owners:
name = owner['name']
age = owner['age']
print(f'{name} is {age} years old.')
Это выведет следующее:
Alice is 30 years old.
Bob is 35 years old.
Чтение JSON-файлов
Начнем с чтения JSON-файла. Предположим, у нас есть файл employees.json с следующим содержимым:
{
"employees": [
{
"firstName": "John",
"lastName": "Doe"
},
{
"firstName": "Anna",
"lastName": "Smith"
},
{
"firstName": "Peter",
"lastName": "Jones"
}
]
}
employees.json уже существует в /home/labex/project.
Для чтения этого файла в Python мы можем использовать следующий код:
import json
## Откройте файл
with open('/home/labex/project/employees.json', 'r') as file:
## Загрузите содержимое файла в переменную
data = json.load(file)
## Печать содержимого файла
print(data)
Это выведет следующее:
{'employees': [{'firstName': 'John', 'lastName': 'Doe'}, {'firstName': 'Anna', 'lastName': 'Smith'}, {'firstName': 'Peter', 'lastName': 'Jones'}]}
Мы можем получить доступ к данным в файле, используя ключи JSON-объекта, так же, как это делается с Python-словарем. Например, чтобы получить список сотрудников, мы можем использовать ключ employees:
employees = data['employees']
print(employees)
Это выведет следующее:
[{'firstName': 'John', 'lastName': 'Doe'}, {'firstName': 'Anna', 'lastName': 'Smith'}, {'firstName': 'Peter', 'lastName': 'Jones'}]
Мы также можем пройти по списку сотрудников и вывести их имена:
for employee in employees:
print(employee['firstName'], employee['lastName'])
Это выведет следующее:
John Doe
Anna Smith
Peter Jones
Запись в JSON-файлы
Теперь, когда мы знаем, как читать JSON-файл, давайте научимся записывать в него. Мы можем использовать функцию json.dump() для записи данных в JSON-файл.
Предположим, у нас есть список словарей, содержащих информацию о студентах. Мы можем записать эти данные в файл с именем students.json следующим образом:
import json
## Список словарей
students = [
{ "name": "Alice", "age": 26, "major": "Computer Science" },
{ "name": "Bob", "age": 27, "major": "Economics" },
{ "name": "Charlie", "age": 25, "major": "Physics" }
]
## Откройте файл
with open('students.json', 'w') as file:
## Запишите данные в файл
json.dump(students, file)
Теперь давайте проверим, были ли данные записаны правильно:
with open('students.json', 'r') as file:
data = json.load(file)
print(data)
Это выведет следующее:
[
{ "name": "Alice", "age": 26, "major": "Computer Science" },
{ "name": "Bob", "age": 27, "major": "Economics" },
{ "name": "Charlie", "age": 25, "major": "Physics" }
]
Мы также можем использовать функцию json.dumps() для преобразования объекта Python в JSON-строку, которую мы можем затем сохранить в файл или отправить по сети. Вот пример:
## Преобразуйте список словарей в JSON-строку
json_string = json.dumps(students)
print(json_string)
## Сохраните строку в файл
with open('students.json', 'w') as file:
file.write(json_string)
## Теперь давайте проверим, были ли данные записаны правильно
with open('students.json', 'r') as file:
data = json.load(file)
print(data)
Это будет иметь тот же вывод, что и предыдущий пример.
Объект Python и JSON-строка
Python-объект - это коллекция данных в виде списков, словарей и т.д., которая хранится в памяти. JSON-строка же - это сериализованное представление JSON-объекта. Это строка символов, представляющая данные в JSON-объекте, но она не хранится в памяти в виде фактического объекта.
Вот пример того, как использовать функцию read() для чтения содержимого students.json:
with open('students.json', 'r') as file:
json_string = file.read()
print(json_string)
Это выведет следующее:
[{"name": "Alice", "age": 26, "major": "Computer Science"}, {"name": "Bob", "age": 27, "major": "Economics"}, {"name": "Charlie", "age": 25, "major": "Physics"}]
Когда вы пытаетесь получить первый элемент json_string, вы получите первый символ строки:
print(json_string[0])
[
Это потому, что json_string - это строка, а не список (Python-объект). Чтобы преобразовать ее в список, мы можем использовать функцию json.loads():
import json
## Преобразуйте JSON-строку в Python-объект
python_object = json.loads(json_string)
print(python_object)
Вывод будет похож на вышеуказанный, с разницей между одинарными и двойными кавычками.
[{'name': 'Alice', 'age': 26,'major': 'Computer Science'}, {'name': 'Bob', 'age': 27,'major': 'Economics'}, {'name': 'Charlie', 'age': 25,'major': 'Physics'}]
Теперь мы можем получить доступ к первому элементу списка:
print(python_object[0])
{ "name": "Alice", "age": 26, "major": "Computer Science" }
Начинающие часто путать Python-объект и JSON-строку, поэтому обращайте особое внимание.
Резюме
Поздравляем! Вы завершили лабораторную работу по JSON-файлам. Вы узнали, как читать и записывать JSON-файлы в Python. Также вы узнали, как работать с данными JSON в Python.



