Обработка JSON в языке Python

Словари в Python

Словарём (или ассоциативным массивом, англ. dictionary) называется структура данных, предназначенная для хранения информации в виде пар (ключ, значение). Если провести аналогию с массивами, то ключ словаря играет ту же роль, что и индекс массива - имея ключ, можно получить соответствующее ему значение. В отличие от массива, ключи словаря могут иметь произвольные типы, например строки или те же словари. Словари являются популярной структурой данных для хранения сопоставления между идентификаторами каких-либо объектов и подробной информации об этих объектах.

В Python словарь является встроенным типом данных - для его использования не требуется подключать никаких сторонних библиотек, а для его создания существует специальный синтаксис.

# создание пустого словаря
my_dict = {}
# другой способ
my_dict = dict()

# добавление элемента в словарь
# ключом является строковая константа "Волгоград", а значением - число 1000000
my_dict["Волгоград"] = 1000000

# доступ к элементу по ключу и вывод на экран
# выведет 1000000
print(my_dict["Волгоград"])

При попытке доступа к элементу с ключом, который отсутствует в словаре, возникнет исключение. Чтобы этого не случилось, можно использовать метод .get(), возвращающий указанное значение по умолчанию, если запрашиваемый ключ отсутствует:

my_dict = {}

# вызовет исключение
print(my_dict["blabla"])

# выведет 123
print(my_dict.get("blabla", 123))

Для создания словарей можно использовать специальный синтаксис:

# d1 и d2 в коде ниже эквивалентны

d1 = {
  True: 1,
  False: 0
}

d2 = {}
d2[True] = 1
d2[False] = 0

В словаре не может быть двух значений с одинаковыми ключами:

d1 = {
    'a': 11,
    'b': 22,
    'b': 33,
    'c': 44
  }

# выведет 33
print(d1['b'])

Организовывать циклы по словарям можно несколькими способами: по ключам, по значениям, или по парам (ключ, значение):

d1 = {
    'a': 11,
    'b': 22,
    'b': 33,
    'c': 44
  }

for k in d1.keys():
  print(k) # выведет буквы

for v in d1.values():
  print(v) # выведет числа

for t in d1.items():
  print(t) # выведет пары

Формат JSON

JSON (JavaScript Object Notation) - текстовый формат для хранения и передачи данных в виде пар (ключ, значение). Первоначально являлся частью языка JavaScript и применялся для передачи информации между веб-сайтом и браузером пользователя. На сегодняшний день JSON является популярным способом сериализации данных и используется в различных протоколах и языках программирования.

Синтаксическая структура JSON очень напоминает синтаксис Python для объявления словарей. В отличие от Python, ключи в JSON могут быть только строками, а булевы константы записываются с маленькой буквы.

Объект JSON обрамляется символами { и } и состоит из произвольного числа полей. Каждое поле имеет вид ключ: значение, где ключ - произвольная строка. Значениями в JSON являются:

Приведём пример JSON-объекта, описывающего химический элемент:

{
  "Название": "Кислород",
  "АтомнаяМасса": 15.99903,
  "ТермодинамическаяФаза": "Газ",
  "СтепениОкисления": ["–2", "−1", "–0.5", "-0.333", "0", "+0.5", "+1", "+2"],
  "ПростоеВещество": true
}

Обратка JSON-информации в Python

Для работы с JSON в языке Python необходим одноимённый модуль:

import json

Этот модуль предоставляет функции, позволяющие конвертировать текстовое представление JSON-объектов в словари Python и наоборот. Таким образом, обработка JSON в Python сводится к следующим шагам:

  1. Построение словаря из входного JSON-файла или строки.
  2. Работа со словарём, как с обычным значением Python.
  3. Генерация JSON-объекта из обработанного словаря в строковую переменную или в выходной файл.

Рассмотрим пример, реализующий эти шаги:

# построение словаря из JSON-строки:
str = '''
{
  "Название": "Кислород",
  "АтомнаяМасса": 15.99903,
  "ТермодинамическаяФаза": "Газ",
  "СтепениОкисления": ["–2", "−1", "–0.5", "-0.333", "0", "+0.5", "+1", "+2"],
  "ПростоеВещество": true
}
'''
d1 = json.loads(str)
# построение словаря из файла с JSON-объектом
d2 = json.load(open("file.json"))

# работа со словарём: изменим степень окисления
d1["СтепениОкисления"].remove("0")

# генерация JSON в виде строки
print(json.dumps(d1))
# генерация JSON в выходной файл
json.dump(d1, open("file2.json", "w"))

Функции load и loads принимают следующие необязательные именованные параметры:

Функции dump и dumps принимают следующие необязательные именованные параметры:

Контрольные вопросы

  1. Может ли в словаре находиться единственный элемент с ключом 4?
  2. Каким образом нужно вызвать функцию loads, чтобы в полученном словаре все числа с плавающей точкой оказались округлёнными до целых?
  3. В какой ситуации может понадобиться передать skipkeys=True в вызов dump/dumps?
  4. В чём может быть причина того, что параметр sort_keys равен False по умолчанию?

Задание на лабораторную работу

Написать программу, обрабатывающую JSON-файл в соответствии с вариантом. Пользователь может искать записи, удовлетворяющие определённому критерию, а так же вносить новые записи в файл.

Варианты заданий

Вариант 1

Вариант 2

Вариант 3

Вариант 4

Вариант 5

Вариант 6

Вариант 7

Вариант 8

Вариант 9

Вариант 10

Вариант 11

Вариант 12

Вариант 13

Вариант 14

Вариант 15