Чтение и разбор JSON из URL в Python

Чтение JSON из URL в Python превращает удалённый ответ в данные, с которыми можно работать сразу. Загрузите ответ с помощью urllib.request, затем передайте его тело в json.loads, чтобы получить словарь или список. Этот подход подходит для публичных API, размещённых конфигурационных файлов и наборов данных, которые меняются независимо от вашего кода.

Пример Чтения JSON из URL на Python

Вывод:

Результат появится здесь...

Вывод:

Squad: Super Hero Squad
Members: 3

Как Работает Этот Пример

  1. urllib.request.urlopen(url) отправляет синхронный GET-запрос и возвращает HTTP-ответ; блок with закрывает соединение после выхода.
  2. response.read() возвращает тело как сырые байты. json.loads принимает байты напрямую, поэтому ручной шаг .decode("utf-8") не нужен.
  3. Разбор превращает JSON-объект в Python dict, который индексируется через data["squadName"] и измеряется через len(data["members"]).

В этом рантайме urlopen работает синхронно, поэтому await и asyncio не нужны, даже если многие руководства оборачивают сетевые вызовы в асинхронный код.

json.load против json.loads

Обе функции десериализуют JSON в объекты Python; разница — в том, откуда они читают.

ФункцияВходные данныеИспользуйте, когда
json.loads(...)значение str или bytesсодержимое уже есть в памяти, например response.read()
json.load(...)файловый или потоковый объектесть открытый дескриптор, например open(path) или сам ответ

Здесь json.loads(response.read()) и json.load(response) дают одинаковый словарь. Типичная ошибка — передать не тот тип: строку в json.load или файловый объект в json.loads вызовет AttributeError или TypeError.

Просмотр JSON-запроса в Run Details

Откройте Run Details после завершения программы. Он разделяет сетевой запрос скрипта и пакеты, загруженные рантаймом для его выполнения.

Сигнал Run DetailsЧто это означает
Requests показывает один GET на raw.githubusercontent.com со статусом 200JSON-файл успешно загружен по сети
Длительность запроса в мсСколько занял сам запрос, отдельно от разбора
Запрос вернул 403/404, заблокирован или завершился ошибкойURL недоступен или не поддерживает CORS, поэтому запрос не дошёл до кода
Packages пуст («No runtime packages»)json и urllib — стандартная библиотека, ничего не устанавливалось

Пустой раздел Packages подтверждает, что этот подход не требует установки зависимостей. Примеры, которые импортируют beautifulsoup4 или pandas, перечисляют загруженный пакет здесь, например пример веб-скрапинга; чтение JSON из стандартной библиотеки ничего не показывает.

Чтение из URL в браузере работает только если эндпоинт отправляет CORS-заголовки. Файл в примере — CORS-совместимый файл на GitHub raw; кросс-доменный URL без этих заголовков блокируется до выполнения кода, что проявляется как упавший запрос, а не JSONDecodeError.

Частые Ошибки При Чтении JSON из URL

Ошибка: двойное чтение потока ответа.

Неправильно:

raw = response.read()
data = json.loads(response.read())

Правильно:

data = json.loads(response.read())

Почему это происходит: urlopen возвращает поток, который можно прочитать один раз; второй вызов read() вернёт пустые байты.

Ошибка: вызов .get() на разобранном JSON-массиве.

Неправильно:

data = json.loads(response.read())
first = data.get("name")

Правильно:

data = json.loads(response.read())
first = data[0] if isinstance(data, list) else data["name"]

Почему это происходит: JSON-массив верхнего уровня разбирается в список Python, у которого нет .get; его нужно индексировать.

Обработка Ошибок и Отсутствующих Ключей

urlopen выбрасывает HTTPError для 4xx и 5xx ответов, но объект ошибки всё ещё читаем, поэтому JSON-тело ошибки можно разобрать, перехватив его через try/except:

from urllib.error import HTTPError

try:
    with urllib.request.urlopen(url) as response:
        data = json.loads(response.read())
except HTTPError as err:
    data = json.loads(err.read())

Для необязательного поля используйте data.get("key"), чтобы получить None вместо KeyError. Стандартный модуль json безопасно разбирает недоверенные данные, поэтому никогда не используйте eval() для чтения JSON.

FAQ

Как прочитать JSON-файл в Python?

Для удалённого файла откройте его через urllib.request.urlopen(url) и передайте байты в json.loads. Для файла на диске используйте with open(path) as f: data = json.load(f). Оба варианта возвращают словарь или список Python.

В чём разница между json.load и json.loads?

json.load читает из файлового или потокового объекта, а json.loads читает из значения str или bytes. Буква «s» в конце означает «string» (строка). Используйте loads, когда содержимое уже в памяти.

Нужна ли библиотека requests для чтения JSON в Python?

Нет. urllib.request и json — оба входят в стандартную библиотеку, поэтому загружать и разбирать JSON можно без установки зависимостей. Библиотека requests добавляет удобства вроде метода .json() и управления сессиями, но является сторонней зависимостью.

Что такое JSON в Python?

JSON — текстовый формат для структурированных данных. Python преобразует JSON-объект в словарь, массив — в список, а примитивы в str, int, float, bool и None — именно это возвращает json.loads после разбора.