Json.load: примеры (PYTHON)

Использование json.load для работы с JSON в Python
Раздел: JSON, Десериализация
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 из файла с сохранением порядка элементов:

Пример python
import json
from collections import OrderedDict

with open('data.json', 'r') as f:
    data = json.load(f, object_pairs_hook=OrderedDict)

Обработка специальных числовых значений:

Пример python
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):

Пример python
import json
import io

file_like = io.StringIO('{"test": "value"}')
data = json.load(file_like)
{'test': 'value'}

Кастомное преобразование с проверкой структуры:

Пример python
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)

Обработка вложенных структур:

Пример python
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)

питон json.load function comments

En
Json.load Deserialize JSON file to object