Чтение и разбор JSON из URL в Python
Чтение JSON из URL в Python превращает удалённый ответ в данные, с которыми можно работать сразу. Загрузите ответ с помощью urllib.request, затем передайте его тело в json.loads, чтобы получить словарь или список. Этот подход подходит для публичных API, размещённых конфигурационных файлов и наборов данных, которые меняются независимо от вашего кода.
Пример Чтения JSON из URL на Python
Вывод:
Результат появится здесь...
Вывод:
Squad: Super Hero Squad
Members: 3
Как Работает Этот Пример
urllib.request.urlopen(url)отправляет синхронный GET-запрос и возвращает HTTP-ответ; блокwithзакрывает соединение после выхода.response.read()возвращает тело как сырые байты.json.loadsпринимает байты напрямую, поэтому ручной шаг.decode("utf-8")не нужен.- Разбор превращает 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 со статусом 200 | JSON-файл успешно загружен по сети |
| Длительность запроса в мс | Сколько занял сам запрос, отдельно от разбора |
| Запрос вернул 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 после разбора.