Загрузка и разбор JSON в коде на Python: практические примеры
Основные способы извлечения информации из 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]) # dynamicPython 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