Json.loads: примеры (PYTHON)
json.loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook): objectОсновные сведения о json.loads
Функция json.loads() в модуле json преобразует строку JSON в объект Python. Метод применяется для десериализации данных, полученных из внешних источников.
Синтаксис функции:
json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None)Аргументы:
- s - строка или байты, содержащие JSON-документ
- cls - пользовательский декодер (по умолчанию
JSONDecoder) - object_hook - функция для преобразования словаря в другой объект
- parse_float - функция для обработки чисел с плавающей точкой
- parse_int - функция для обработки целых чисел
- parse_constant - функция для обработки констант JSON (null, true, false)
- object_pairs_hook - функция для обработки упорядоченных пар ключ-значение
Возвращаемое значение - объект Python, соответствующий переданному JSON.
Базовые примеры использования
Преобразование простого JSON в словарь:
import json
json_str = '{"name": "John", "age": 30}'
data = json.loads(json_str)
print(type(data))
print(data)<class 'dict'>
{'name': 'John', 'age': 30}Обработка чисел и массивов:
json_str = '[1, 2.5, true, false, null]'
data = json.loads(json_str, parse_float=float, parse_int=int)
print(data)[1, 2.5, True, False, None]
Использование object_hook для преобразования:
def custom_hook(obj):
if 'date' in obj:
return obj['date']
return obj
json_str = '{"date": "2024-01-15"}'
data = json.loads(json_str, object_hook=custom_hook)
print(data)2024-01-15
Альтернативные функции в Python
json.load() - загружает JSON из файлового объекта. Используется при работе с файлами вместо строк.
orjson.loads() - из библиотеки orjson, быстрее стандартной реализации. Работает только с байтами.
simplejson.loads() - из библиотеки simplejson, совместима со стандартным модулем, имеет дополнительные настройки.
pandas.read_json() - в библиотеке pandas, преобразует JSON в DataFrame, удобен для анализа данных.
Аналоги в других языках программирования
JavaScript: JSON.parse() работает аналогично, но не имеет дополнительных параметров для преобразования типов.
const jsonStr = '{"name": "John"}';
const obj = JSON.parse(jsonStr);
console.log(obj.name);John
Java: Используются библиотеки Jackson, Gson или org.json
import org.json.JSONObject;
String jsonStr = "{\"name\": \"John\"}";
JSONObject obj = new JSONObject(jsonStr);
String name = obj.getString("name");PHP: json_decode() с параметром ассоциативного массива
$jsonStr = '{"name": "John"}';
$data = json_decode($jsonStr, true);
echo $data['name'];John
Go: json.Unmarshal() с явным указанием структуры
import "encoding/json"
type Person struct { Name string }
var jsonStr = []byte(`{"name":"John"}`)
var p Person
err := json.Unmarshal(jsonStr, &p)Типичные ошибки
Некорректный JSON приводит к JSONDecodeError:
import json
try:
data = json.loads('{"name": John}')
except json.JSONDecodeError as e:
print(f"Ошибка: {e}")Ошибка: Expecting value: line 1 column 10 (char 9)
Передача неподдерживаемого типа данных:
import json
try:
data = json.loads(b'{"key": "value"}')
except TypeError as e:
print(f"Ошибка типа: {e}")Ошибка типа: the JSON object must be str, bytes or bytearray, not bytes
Проблемы с кодировкой:
import json
json_str = '{"text": "Привет"}'.encode('utf-8')
data = json.loads(json_str.decode('utf-8'))
print(data){'text': 'Привет'}Изменения в последних версиях
В Python 3.6 добавлена поддержка байтовых строк для аргумента s.
В Python 3.9 появился параметр object_pairs_hook для сохранения порядка пар ключ-значение.
В Python 3.11 улучшена производительность при обработке вложенных структур.
Расширенные примеры
Десериализация с сохранением порядка элементов:
import json
from collections import OrderedDict
json_str = '{"z": 1, "a": 5, "m": 3}'
data = json.loads(json_str, object_pairs_hook=OrderedDict)
print(list(data.keys()))['z', 'a', 'm']
Использование пользовательского декодера:
import json
from datetime import datetime
class CustomDecoder(json.JSONDecoder):
def decode(self, s):
obj = super().decode(s)
if isinstance(obj, dict) and 'date' in obj:
obj['date'] = datetime.fromisoformat(obj['date'])
return obj
json_str = '{"event": "meeting", "date": "2024-01-15T10:30:00"}'
data = json.loads(json_str, cls=CustomDecoder)
print(type(data['date']))<class 'datetime.datetime'>
Обработка больших чисел:
import json
import decimal
def parse_decimal(num_str):
return decimal.Decimal(num_str)
json_str = '{"price": 123.45678901234567890}'
data = json.loads(json_str, parse_float=parse_decimal)
print(data['price'])
print(type(data['price']))123.45678901234567890 <class 'decimal.Decimal'>
Работа с вложенными структурами:
import json
json_str = '''{
"users": [
{"id": 1, "name": "Alice", "active": true},
{"id": 2, "name": "Bob", "active": false}
],
"total": 2
}'''
data = json.loads(json_str)
for user in data['users']:
if user['active']:
print(f"Активный пользователь: {user['name']}")Активный пользователь: Alice