Исходный код EJIO.utils.serialization.implementations.json_serializer
## /utils/serialization/implementations/json_serializer.py
from json import JSONDecodeError, dumps, loads, dump, load
from os.path import exists
from typing import Any
from ..serializer import Serializer
from ..serializer_registry import register_serializer
from ..err import SerializationError
__all__ = [
'JSONSerializer'
]
[документация]
@register_serializer('json')
class JSONSerializer(Serializer):
"""
Реализация интерфейса Serializer для формата JSON.
"""
__slots__ = ()
[документация]
@staticmethod
def serialize[T](data: dict[str, T], /, **kwargs: Any) -> str:
"""
Преобразовать словарь в JSON-строку.
:param data: Сериализуемый словарь.
:param kwargs: Ключевые параметры для сереализатора.
:return: JSON-строка.
:raises SerializationError: При ошибках сериализации.
"""
try:
return dumps(data, **kwargs)
except (TypeError, OverflowError) as e:
raise SerializationError(f"Serialization to json failed") from e
[документация]
@staticmethod
def deserialize[T](data: str, /, **kwargs: Any) -> dict[str, T]:
"""
Преобразовать JSON-строку обратно в словарь.
:param data: JSON-строка.
:param kwargs: Ключевые параметры для сереализатора.
:return: Словарь, полученный из строки.
:raises SerializationError: При ошибках десериализации.
"""
try:
return loads(data, **kwargs)
except JSONDecodeError as e:
raise SerializationError(f"Deserialization from json failed") from e
[документация]
@staticmethod
def save[T](data: dict[str, T], filename: str, /, **kwargs: Any) -> None:
"""
Сохранить словарь в JSON-файл.
:param data: Сериализуемый словарь.
:param filename: Путь к файлу для сохранения.
:param kwargs: Ключевые параметры для сереализатора.
:raises SerializationError: При ошибках сериализации.
"""
try:
with open(filename, 'w') as f:
dump(data, f, **kwargs)
except (IOError, OSError) as e:
raise SerializationError(f"Failed to serialize data to file") from e
[документация]
@staticmethod
def load[T](filename: str, /, **kwargs: Any) -> dict[str, T]:
"""
Загрузить словарь из JSON-файла.
:param filename: Путь к файлу для загрузки.
:param kwargs: Ключевые параметры для сереализатора.
:return: Словарь, полученный из строки.
:raises SerializationError: При ошибках десериализации.
"""
try:
if not exists(filename):
raise FileNotFoundError(f"File {filename} not found")
with open(filename, 'r') as f:
data = load(f, **kwargs)
return data
except (IOError, OSError, FileNotFoundError) as e:
raise SerializationError(f"Failed to deserialize data from file") from e