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

Использование json.loads для преобразования JSON в Python
Раздел: JSON, Десериализация
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 улучшена производительность при обработке вложенных структур.

Расширенные примеры

Десериализация с сохранением порядка элементов:

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

Использование пользовательского декодера:

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

Обработка больших чисел:

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

Работа с вложенными структурами:

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

питон json.loads function comments

En
Json.loads Deserialize JSON string to object