Json.load: примеры (PYTHON)
json.load(fp, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook): objectОсновные характеристики функции json.load
Функция json.load() из модуля json выполняет чтение и десериализацию JSON-данных из файлового объекта. Этот метод преобразует JSON-строку, содержащуюся в файле, в соответствующие объекты Python.
Функция применяется при работе с JSON-данными, хранящимися в файлах на диске, или при обработке потоков данных через файлоподобные объекты.
Аргументы функции
- fp (обязательный) – файловый объект, поддерживающий метод
.read(). Это может быть обычный файл, открытый с помощьюopen(), или любой объект с аналогичным интерфейсом. - object_hook (необязательный) – функция, вызываемая для каждого словаря (object) в JSON. Позволяет выполнить кастомное преобразование.
- parse_float (необязательный) – функция для преобразования строк чисел с плавающей точкой. По умолчанию используется
float(). - parse_int (необязательный) – функция для преобразования строк целых чисел. По умолчанию используется
int(). - parse_constant (необязательный) – функция для обработки специальных JSON-литералов (
NaN,Infinity,-Infinity). - object_pairs_hook (необязательный) – функция, вызываемая для списка пар ключ-значение. Позволяет контролировать порядок элементов.
Возвращаемое значение
Функция возвращает объект Python, соответствующий переданным JSON-данным: словарь для объектов, список для массивов, строку для строк, int/float для чисел, True/False для boolean, None для null.
Базовые примеры применения
Пример чтения простого JSON-файла:
import json
with open('data.json', 'r', encoding='utf-8') as file:
data = json.load(file)
print(type(data))<class 'dict'>
Использование object_hook для преобразования:
import json
def custom_decoder(obj):
if "date" in obj:
return {"timestamp": obj["date"]}
return obj
with open('data.json', 'r') as f:
result = json.load(f, object_hook=custom_decoder){'timestamp': '2024-01-15'}Применение parse_float для Decimal:
import json
from decimal import Decimal
with open('prices.json', 'r') as f:
data = json.load(f, parse_float=Decimal)Decimal('19.99')Альтернативные функции в Python
json.loads() – десериализует JSON из строки, а не из файла. Используется при работе с данными в строковом представлении.
ujson.load() (сторонняя библиотека) – более быстрая реализация, но с некоторыми ограничениями в поддержке спецификации JSON.
yaml.safe_load() из библиотеки PyYAML – для чтения YAML-файлов, которые имеют схожие структуры, но расширенный синтаксис.
Выбор зависит от источника данных: json.load() – для файлов, json.loads() – для строк, сторонние библиотеки – при требовании к производительности.
Реализации в других языках программирования
JavaScript: JSON.parse() работает аналогично json.loads().
const jsonString = '{"name": "John"}';
const obj = JSON.parse(jsonString);{name: 'John'}PHP: json_decode() с параметром true возвращает ассоциативный массив.
$json = '{"a":1, "b":2}';
$array = json_decode($json, true);Array ( [a] => 1 [b] => 2 )
Java: Используются библиотеки типа Jackson, Gson.
ObjectMapper mapper = new ObjectMapper();
MyClass obj = mapper.readValue(new File("data.json"), MyClass.class);Golang: json.Unmarshal() требует предварительного чтения файла в байты.
data, _ := ioutil.ReadFile("data.json")
var result map[string]interface{}
json.Unmarshal(data, &result)Основное отличие Python-реализации – прямое принятие файлового объекта и наличие дополнительных параметров обработки.
Типичные ошибки при работе с функцией
Некорректная кодировка файла:
with open('data.json', 'r') as f: # Без указания encoding
json.load(f)UnicodeDecodeError: 'charmap' codec can't decode...
Неправильный JSON-синтаксис:
content = '{ "key": "value" 'json.decoder.JSONDecodeError: Expecting property name
Попытка чтения несуществующего файла:
with open('missing.json', 'r') as f:
json.load(f)FileNotFoundError: [Errno 2] No such file...
Передача неподдерживаемого объекта:
json.load("строка")AttributeError: 'str' object has no attribute 'read'
Изменения в последних версиях Python
В Python 3.9 добавлены параметры parse_int и parse_float для функций json.load() и json.loads().
Начиная с Python 3.6, параметр object_pairs_hook вызывается перед object_hook, что позволяет более тонко контролировать порядок обработки.
В Python 3.11 улучшена производительность и детализация сообщений об ошибках при парсинге JSON.
Расширенные примеры использования
Чтение JSON из файла с сохранением порядка элементов:
import json
from collections import OrderedDict
with open('data.json', 'r') as f:
data = json.load(f, object_pairs_hook=OrderedDict)Обработка специальных числовых значений:
import json
import math
def handle_constants(val):
if val == "Infinity":
return math.inf
return val
json_str = '{"max": Infinity}'
data = json.loads(json_str, parse_constant=handle_constants){'max': inf}Использование с файлоподобными объектами (io.StringIO):
import json
import io
file_like = io.StringIO('{"test": "value"}')
data = json.load(file_like){'test': 'value'}Кастомное преобразование с проверкой структуры:
import json
from datetime import datetime
def date_parser(d):
if "created_at" in d:
d["created_at"] = datetime.fromisoformat(d["created_at"])
return d
with open('log.json', 'r') as f:
logs = json.load(f, object_hook=date_parser)Обработка вложенных структур:
import json
def flatten_nested(obj, parent_key=''):
items = []
for k, v in obj.items():
new_key = f"{parent_key}_{k}" if parent_key else k
if isinstance(v, dict):
items.extend(flatten_nested(v, new_key).items())
else:
items.append((new_key, v))
return dict(items)
with open('nested.json', 'r') as f:
data = json.load(f, object_hook=flatten_nested)