Работа с данными JSON в стиле Python

PythonBeginner
Практиковаться сейчас

Введение

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.