Загрузка и разбор JSON в коде на Python: практические примеры

Раздел: Основы Python -> Работа с JSON

Основные способы извлечения информации из JSON

Как наиболее эффективно получить данные из JSON в Python?

Стандартная библиотека Python включает модуль json, который предоставляет два главных инструмента для чтения JSON:

  • json.loads() – преобразует строку JSON в объект Python (словарь, список и т.д.).
  • json.load() – читает JSON из файлового объекта.

После преобразования данные становятся обычными структурами Python. Доступ к значениям выполняется через квадратные скобки или метод dict.get().

import json

json_string = '{"name": "Python", "version": 3.11, "features": ["dynamic", "interpreted"]}'
data = json.loads(json_string)

print(data['name'])        # Python
print(data.get('version')) # 3.11
print(data['features'][0]) # dynamic

Python json get (получение данных из json в python)

Python
3.11
dynamic

Типичная ошибка: забыть импортировать модуль json или передать в json.loads() нестроковый объект. Если строка не соответствует формату JSON, возникает json.JSONDecodeError. Используйте блок try-except для отлова.

Как получить данные из файла JSON?

Работа с файлами требует открытия потока и вызова json.load(). Рекомендуется использовать менеджер контекста with.

import json

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

print(data)

Проблемы: файл может отсутствовать (FileNotFoundError) или содержать невалидный JSON (JSONDecodeError). Также важно указывать правильную кодировку, иначе могут появиться символы-заменители.

Как безопасно извлечь значение, если ключ может отсутствовать?

Метод dict.get(key, default) возвращает значение по ключу или default, если ключа нет. Это предотвращает KeyError.

data = {'name': 'Python', 'version': 3.11}
print(data.get('released', 'неизвестно'))
неизвестно

Как получить JSON из интернета (HTTP-запрос)?

Библиотека requests упрощает загрузку JSON. После вызова requests.get() используйте метод .json(), который внутри вызывает json.loads().

import requests

response = requests.get('https://api.github.com/users/python')
data = response.json()

print(data['login'])

Ошибки: сетевые сбои, статус ответа не 200, некорректный JSON в теле ответа. Проверяйте статус с помощью response.raise_for_status().

Как работать с вложенными структурами JSON?

JSON может содержать многоуровневые объекты и массивы. Доступ к вложенным элементам осуществляется цепочкой обращений.

complex_json = '''
{
  "user": {
    "name": "Alice",
    "contacts": [
      {"type": "email", "value": "alice@example.com"}
    ]
  }
}
'''
data = json.loads(complex_json)
email = data['user']['contacts'][0]['value']
print(email)
alice@example.com

Опасность: если любой из промежуточных ключей отсутствует, возникнет KeyError. Используйте .get() на каждом уровне или проверяйте наличие через in.

Как преобразовать JSON-строку другого типа (не словаря)?

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

json_arr = '[1, 2, 3]'
arr = json.loads(json_arr)
print(type(arr), arr)
<class 'list'> [1, 2, 3]

Дополнительные примеры с пошаговыми пояснениями.

Расширенные сценарии получения данных из JSON

Пример 1: Загрузка большого JSON-файла с обработкой ошибок

Пример
import json

try:
    with open('huge_data.json', 'r', encoding='utf-8') as file:
        data = json.load(file)
        print('Количество записей:', len(data))
except FileNotFoundError:
    print('Файл не найден')
except json.JSONDecodeError as e:
    print('Ошибка разбора JSON:', e)

Пример 2: Использование json.JSONDecoder для гибкого анализа

Пример
import json

complex_str = '{"a": 1, "b": [true, null, "мир"]}'
decoder = json.JSONDecoder()
data, idx = decoder.raw_decode(complex_str)
print('Распарсено:', data)
print('Остаток строки:', complex_str[idx:])
Распарсено: {'a': 1, 'b': [True, None, 'мир']}
Остаток строки: 

Пример 3: Рекурсивный обход JSON-дерева с поиском всех значений по ключу

Пример
import json

def find_values(obj, key):
    results = []
    if isinstance(obj, dict):
        for k, v in obj.items():
            if k == key:
                results.append(v)
            elif isinstance(v, (dict, list)):
                results.extend(find_values(v, key))
    elif isinstance(obj, list):
        for item in obj:
            results.extend(find_values(item, key))
    return results

data_str = '{"name": "root", "items": [{"name": "item1"}, {"name": "item2"}]}'
data = json.loads(data_str)
names = find_values(data, 'name')
print(names)
['root', 'item1', 'item2']

Пример 4: Преобразование JSON-строки с датами (использование object_hook)

Пример
import json
from datetime import datetime

def custom_decoder(dct):
    if 'date' in dct:
        dct['date'] = datetime.strptime(dct['date'], '%Y-%m-%d')
    return dct

json_input = '{"event": "meeting", "date": "2025-03-28"}'
data = json.loads(json_input, object_hook=custom_decoder)
print(type(data['date']), data['date'])
<class 'datetime.datetime'> 2025-03-28 00:00:00

Пример 5: Загрузка JSON из URL с проверкой заголовков и кодировкой

Пример
import requests
import json

url = 'https://jsonplaceholder.typicode.com/posts/1'
response = requests.get(url)
response.encoding = 'utf-8' # явно задаём кодировку
try:
    response.raise_for_status()
    data = response.json()  # эквивалентно json.loads(response.text)
    print(data['title'])
except requests.exceptions.RequestException as e:
    print('Ошибка соединения:', e)
except json.JSONDecodeError as e:
    print('Неверный JSON:', e)
sunt aut facere repellat provident occaecati excepturi optio reprehenderit

Получение данных из JSON в Python - comments

En
Python json get (python)