JavaRush /Курсы /Модуль 1: Python Core /Работа с JSON посредством json

Работа с JSON посредством json

Модуль 1: Python Core
13 уровень , 1 лекция
Открыта

2.1 Модуль json

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

Модуль json в Python предоставляет функции для сериализации (преобразования объектов Python в строки JSON) и десериализации (преобразования строк JSON в объекты Python). Этот модуль встроен в стандартную библиотеку Python и активно используется для работы с JSON-данными.

Основные функции модуля json очень напоминают таковые у pickle и работают аналогично. А что вы хотите — стандарт!

  • Работа со строками:
    • json.dumps(obj) — Преобразует объект Python в строку JSON.
    • json.loads(s) — Преобразует строку JSON в объект Python.
  • Работа с файлами:
    • json.dump(obj, file) — Сериализует объект Python и записывает его в текстовый файл.
    • json.load(file) — Десериализует объект Python из текстового файла, содержащего данные в формате JSON.

Давайте разберем пару примеров, чтобы лучше запомнить работу этих функций.

2.2 Сериализация в строку

Сериализация объектов Python в строки JSON

Для сериализации объекта в строку нужно просто передать его в функцию json.dumps().


import json

# Пример объекта для сериализации
data = {
    "name": "Alice",
    "age": 30,
    "is_student": False,
    "courses": ["Math", "Science"],
    "address": {
        "city": "New York",
        "zip_code": "10001"
    }
}
            
# Преобразование объекта Python в строку JSON
json_string = json.dumps(data, indent=4)
print("Сериализованные данные (JSON):", json_string)
        

Десериализация строк JSON в объекты Python

Для получения объекта из строки нужно просто передать JSON-строку, содержащую описание объекта, в метод json.loads().


import json

# Пример строки JSON для десериализации
json_string = ''' { "name": "Alice", "age": 30, "is_student": false, "courses": ["Math", "Science"], "address": { "city": "New York", "zip_code": "10001" } } '''
            
# Преобразование строки JSON в объект Python
data = json.loads(json_string)
print("Десериализованные данные (Python):", data)
        

2.3 Сериализация в файл

Запись объектов Python в файл в формате JSON

Для записи объекта в файл нужно вызвать метод json.dump(). При работе с файлами важно использовать обработку исключений, чтобы корректно обрабатывать возможные ошибки. Вот пример:


import json

# Пример объекта для сериализации
data = {
    "name": "Bob",
    "age": 25,
    "is_student": True,
    "courses": ["History", "Literature"],
    "address": {
        "city": "Los Angeles",
        "zip_code": "90001"
    }
}
            
# Запись объекта Python в файл JSON с обработкой исключений
try:
    with open('data.json', 'w') as file:
        json.dump(data, file, indent=4)
    print("Данные успешно записаны в файл.")
except IOError:
    print("Ошибка при записи в файл.")
except json.JSONEncodeError:
    print("Ошибка при кодировании JSON.")
            
        

Чтение объектов Python из файла в формате JSON

Чтение тоже очень простое — просто передаем файл в метод json.load(). Здесь также важно использовать обработку исключений:


import json

# Чтение объекта Python из файла JSON с обработкой исключений
try:
    with open('data.json', 'r') as file:
        data = json.load(file)
    print("Десериализованные данные из файла (Python):", data)
except IOError:
    print("Ошибка при чтении файла.")
except json.JSONDecodeError:
    print("Ошибка при декодировании JSON.")
        

2.4 Дополнительные параметры функций

В функцию, которая занимается сериализацией, можно передать дополнительные параметры, которые сделают ваш JSON красивее:

  • skipkeys: Если True, то пропускает ключи, которые не являются строками, числами или None.
  • ensure_ascii: Если True, все не-ASCII символы будут экранированы с помощью Unicode escape sequences.
  • indent: Если указано число, отступы будут добавлены для лучшей читаемости.
  • sort_keys: Если True, ключи в JSON будут отсортированы по алфавиту.

Пример использования параметров json.dumps():


import json

data = {"c": 3, "b": 2, "a": 1}
            
# Сериализация с сортировкой ключей и отступами
json_string = json.dumps(data, indent=4, sort_keys=True)
print(json_string)
        

2.5 Пользовательские декодеры и кодеры

Модуль json позволяет использовать пользовательские функции для сериализации и десериализации объектов.

Пример пользовательского кодера

Сначала мы создаем специальный класс-кодировщик, который внутри себя проверяет, что если тип объекта == datetime, то возвращает объект как строку ISO-формата.


import json
from datetime import datetime
            
class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime): return obj.isoformat()
        return super().default(obj)
            
data = {
    "name": "Alice",
    "timestamp": datetime.now()
}
            
# Сериализация с пользовательским кодером
json_string = json.dumps(data, cls=CustomEncoder, indent=4)
print(json_string)

Пример пользовательского декодера

Для обратной операции нам тоже нужна функция, которая преобразовывает строку в дату. Например, можно просто проверить имя поля, и если оно называется timestamp, то преобразовать строку в объект datetime:


import json
from datetime import datetime
        
def custom_decoder(dct):
    if 'timestamp' in dct: dct['timestamp'] = datetime.fromisoformat(dct['timestamp'])
    return dct
        
json_string = '''
{
    "name": "Alice",
    "timestamp": "2023-05-15T14:30:00"
}
'''
        
# Десериализация с пользовательским декодером
data = json.loads(json_string, object_hook=custom_decoder)
print(data)
    
2
Задача
Модуль 1: Python Core, 13 уровень, 1 лекция
Недоступна
Использование энкодера
Использование энкодера
2
Задача
Модуль 1: Python Core, 13 уровень, 1 лекция
Недоступна
Использование декодера
Использование декодера
Комментарии (3)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Slevin Уровень 5
10 июля 2025
Можно было бы объяснять и подробнее, чтобы не приходилось спрашивать ЧатГПТ. Например, что метод default - должен называться именно так, потому что JSON по-умолчанию вызывает именно его. Или почему используется именно параметр object_hook...
Дмитрий Уровень 27
14 мая 2025
Интересно, правильно ли я понимаю, что методы в данной лекции чисто умозрительные, потому что если у нас бардак в исходных данных, и словарь, наример, содержит и комплексные числа и отметки времени, и пользовательские классы (яркий пример - набор данных векторного анализатора кабельных сетей), то переопределение метода default в подклассе JSONEncoder не шибко-то и поможет. А поможет предварительная чистка данных, преобразование комплексных чисел в списки, переформатирование штампов времени, упаковка пользовательских объектов и классов в строки и список, и только после этого - сериализация в json?
14 февраля 2025
Тут не сказано как сериализовать произвольный объект, т.е. превратить его в JSON serializable Иначе будет такая ошибка.

TypeError: Object of type CustomClass is not JSON serializable