Чтение файлов JSON в Python: полное руководство

Раздел: Работа с файлами -> Чтение JSON

Чтение JSON в Python

Для работы с JSON в Python встроен модуль json. Он предоставляет функции для чтения данных из файлов и строк. Ниже рассмотрены основные способы, варианты для разных ситуаций и типичные проблемы.

Наиболее эффективное решение для чтения JSON из файла - использование функции json.load() в сочетании с контекстным менеджером with. Это гарантирует корректное закрытие файла даже при возникновении ошибок.

import json

with open('data.json', 'r', encoding='utf-8') as f:
    data = json.load(f)
    print(data)

Python чтение json (чтение json в python)

Пояснение шагов:

  • Модуль json импортируется.
  • Файл data.json открывается в режиме чтения ('r') с указанием кодировки utf-8.
  • Контекстный менеджер with автоматически закроет файл после выхода из блока.
  • json.load(f) читает файловый объект и преобразует содержимое в объект Python (словарь, список и т.д.).
  • Результат сохраняется в переменной data.

Типичная ошибка: файл отсутствует или путь указан неверно - возникает исключение FileNotFoundError. Решение: проверить путь, использовать абсолютный путь или обработать исключение.

try:
    with open('data.json', 'r') as f:
        data = json.load(f)
except FileNotFoundError:
    print('Файл не найден')

Другая распространённая проблема - некорректный JSON (лишние запятые, неправильные кавычки). Возникает json.JSONDecodeError. Решение: проверить файл на валидность через онлайн-валидатор или использовать try/except.

try:
    data = json.load(f)
except json.JSONDecodeError as e:
    print('Ошибка декодирования:', e)

Цель: быстрое и надёжное чтение JSON из файла. Используется, когда данные хранятся в локальном файле и не требуется дополнительная обработка.

Как прочитать JSON из строки, а не из файла?

Когда данные уже загружены в строковую переменную (например, получены по сети или из базы данных), применяется json.loads().

json_str = '{"name": "Alice", "age": 30}'
data = json.loads(json_str)
print(data['name'])

Ошибка: строка содержит невалидный JSON. Используйте try/except как показано выше.

Цель: преобразование строки в объект Python, когда источник не является файлом. Часто используется с HTTP-ответами.

Как читать JSON из URL-адреса?

Для получения JSON с веб-сервера нужна библиотека requests. Ответ необходимо декодировать.

import requests

response = requests.get('https://api.example.com/data')
response.raise_for_status()  # проверка на ошибки HTTP
data = response.json()       # автоматически декодирует JSON из тела ответа
print(data)

Проблемы: сетевые ошибки (ConnectionError), некорректный статус (HTTPError). Обрабатываются через try/except. Если сервер возвращает не JSON, response.json() вызовет JSONDecodeError.

Цель: чтение удалённых данных, например, с REST API. Метод response.json() эквивалентен json.loads(response.text).

Как читать большие JSON-файлы, не загружая их целиком в память?

Стандартный json.load() загружает весь файл в память, что проблематично для гигабайтных данных. Для потокового чтения подходит библиотека ijson.

import ijson

with open('large.json', 'r', encoding='utf-8') as f:
    parser = ijson.parse(f)
    for prefix, event, value in parser:
        if event == 'map_key' and prefix == '':
            print('Ключ:', value)

Проблема: библиотека не встроенная, требует установки (pip install ijson). Также возможны сложности с выбором нужных элементов.

Цель: обработка JSON-файлов, не помещающихся в оперативную память. Альтернатива - построчное чтение, если файл представляет собой NDJSON (каждая строка - отдельный JSON).

Как прочитать JSON с помощью pandas?

Библиотека pandas предоставляет функцию read_json(), которая преобразует JSON в DataFrame.

import pandas as pd

df = pd.read_json('data.json')
print(df.head())

Формат JSON должен соответствовать табличной структуре (например, список объектов). Иначе pandas может интерпретировать данные неверно. Используйте параметр orient для указания формата.

df = pd.read_json('nested.json', orient='records')

Цель: быстрая загрузка данных для анализа в табличном виде. Требуется установка pandas.

Расширенные примеры, демонстрирующие нестандартные сценарии чтения JSON в Python.

Чтение вложенного JSON с object_hook

Функция json.load() принимает параметр object_hook, который позволяет преобразовывать словари в пользовательские объекты.

Пример
import json

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __repr__(self):
        return f'Person({self.name}, {self.age})'

def hook(dct):
    if 'name' in dct and 'age' in dct:
        return Person(dct['name'], dct['age'])
    return dct

json_str = '{"name": "Bob", "age": 25}'
obj = json.loads(json_str, object_hook=hook)
print(obj)
print(type(obj))
Person(Bob, 25)
<class '__main__.Person'>

Чтение JSON из gz-архива без распаковки на диск

Модуль gzip позволяет читать сжатые файлы напрямую.

Пример
import gzip
import json

with gzip.open('data.json.gz', 'rt', encoding='utf-8') as f:
    data = json.load(f)
print(data)

Ошибка: файл не является gz-архивом - gzip.BadGzipFile. Проверяйте расширение.

Чтение NDJSON (JSON Lines)

Файл, где каждая строка - отдельный JSON-объект. Читается построчно.

Пример
import json

with open('data.ndjson', 'r', encoding='utf-8') as f:
    for line in f:
        obj = json.loads(line.strip())
        print(obj.get('id'))

Чтение JSON с ключами, содержащими точки

Стандартный json не обрабатывает точки особым образом, но при преобразовании вложенных структур может понадобиться проход по ключам.

Пример
import json

json_str = '{"person.name": "Alice", "person.age": 30}'
data = json.loads(json_str)
# Доступ к ключу с точкой:
print(data['person.name'])
Alice

Использование json.JSONDecoder для кастомного типа

Можно создать свой декодер, переопределив метод decode().

Пример
import json

class CustomDecoder(json.JSONDecoder):
    def decode(self, s):
        obj = super().decode(s)
        # дополнительная обработка
        return {k.upper(): v for k, v in obj.items()}

decoder = CustomDecoder()
result = decoder.decode('{"name": "test"}')
print(result)
{'NAME': 'test'}

Чтение JSON в Python - comments

En
Python чтение json (python)