Перейти к содержанию

JSONIFY

Описание

jsonify — это Rapidy-кодировщик, используется для преобразования сложных python-объектов к более простым python-объектам или строке.

jsonify сильно упрощает процесс сохранения и отправки сложных данных.

from datetime import datetime
from decimal import Decimal
from pydantic import BaseModel, Field
from rapidy.encoders import jsonify

class InnerData(BaseModel):
    text: str = 'text'

class ComplexData(BaseModel):
    decimal: Decimal = Decimal('1.22223311')
    date: datetime = datetime.now()
    inner: InnerData = Field(default_factory=InnerData)

jsonify('text')  # 'text'
jsonify('text', dumps=True)  # '"text"'

jsonify(Decimal("1.22223311"))  # '1.22223311'

jsonify(ComplexData())  # {'decimal': '1.22223311', 'date': '2024-10-30T10:51:07.884276', 'inner': {'text': 'text'}}
jsonify(ComplexData(), dumps=True)  # '{"decimal": "1.22223311", "date": "2024-10-30T10:51:07.884276", "inner": {"text": "text"}}'

jsonify позволяет преобразовывать любой объект python в строку или более простой объект, который может быть преобразован в формат json.

Вы можете использовать jsonify, чтобы подготовить данные для сохранения в базу данных (например, для MongoDB/Redis или как поле JSON/JSONB в Postgres).

Rapidy также использует jsonify внутри себя при подготовке серверных ответов.

Decimal всегда преобразуется в строку.

Атрибуты jsonify

obj

obj: Any — объект для преобразования (может быть практически чем угодно).

include

include: set[str] | dict[str, Any] | None = None — параметр Pydantic include, передаваемый моделям Pydantic для указания полей, которые нужно включить.

from pydantic import BaseModel, Field
from rapidy.encoders import jsonify

class Result(BaseModel):
    value: str = Field('data', alias='someValue')
    another_value: str = Field('another_data', alias='someAnotherValue')

jsonify(
    Result(),
    include={'value'},
)
# {'someValue': 'data'}


exclude

exclude: set[str] | dict[str, Any] | None = None — параметр Pydantic exclude, передаваемый моделям Pydantic для указания полей, которые нужно исключить.

from pydantic import BaseModel, Field
from rapidy.encoders import jsonify

class Result(BaseModel):
    value: str = Field('data', alias='someValue')
    another_value: str = Field('another_data', alias='someAnotherValue')

jsonify(
    Result(),
    exclude={'value'},
)
# {'someAnotherValue': 'another_data'}

by_alias

by_alias: bool = True — параметр Pydantic by_alias, передаваемый моделям Pydantic, чтобы определить, использовать ли при выводе имена псевдонимов (если они предоставлены) или имена атрибутов Python.

from pydantic import BaseModel, Field
from rapidy.encoders import jsonify

class Result(BaseModel):
    value: str = Field('data', alias='someValue')

jsonify(
    Result(),
    by_alias=True,  # <-- default
)
# {"someValue": "data"}

...

jsonify(
    Result(),
    by_alias=False,
)
# {"value": "data"}


exclude_unset

exclude_unset: bool = False — параметр Pydantic exclude_unset, передаваемый моделям Pydantic для определения, должен ли он исключать из вывода поля, которые не были явно заданы (и имели только значения по умолчанию).

from pydantic import BaseModel, Field
from rapidy.encoders import jsonify

class Result(BaseModel):
    value: str = Field('data', alias='someValue')
    another_value: str = Field('another_data', alias='someAnotherValue')

jsonify(
    Result(someAnotherValue='new_data'),
    exclude_unset=False,  # <-- default
)
# {"someValue": "data", "someAnotherValue": "new_data"}

...

jsonify(
    Result(someAnotherValue='new_data'),
    exclude_unset=True,
)
# {"someAnotherValue": "new_data"}


exclude_defaults

exclude_defaults: bool = False — параметр Pydantic exclude_defaults, передаваемый моделям Pydantic, чтобы определить, нужно ли исключать из вывода поля, которые имеют одинаковое значение по умолчанию, даже если они были заданы явно.

from pydantic import BaseModel, Field
from rapidy.encoders import jsonify

class Result(BaseModel):
    value: str = Field('data', alias='someValue')

jsonify(
    Result(),
    response_exclude_defaults=True,
)
# {}


exclude_none

exclude_none: bool = False — параметр Pydantic exclude_none, передаваемый моделям Pydantic для определения, нужно ли исключать из вывода поля, имеющие значение None.

from pydantic import BaseModel, Field
from rapidy.encoders import jsonify

class Result(BaseModel):
    value: str = Field('data', alias='someValue')
    none_value: None = None

jsonify(
    Result(),
    exclude_none=True,
)
# {"someValue": "data"}

...

jsonify(
    Result(),
    exclude_none=False,  # default
)
# {"someValue": "data", "none_value": null}


charset

charset: str = 'utf-8' — набор символов, который будет использоваться для кодирования и декодирования данных obj.

from rapidy.enums import Charset
from rapidy.encoders import jsonify

jsonify(
    'data',
    charset=Charset.utf32,
    # or
    charset='utf32',
)


dumps

dumps: bool = True — флаг, который определяет, нужно ли делать из созданного объекта строку. Можно указать False, если объект уже является json-строкой.

from rapidy.encoders import jsonify

jsonify('text')  # 'text'
jsonify('text', dumps=True)  # '"text"'


dumps_encoder

dumps_encoder: Callable = json.dumps — любой вызываемый объект, который принимает объект и возвращает строку JSON.

from typing import Any
from rapidy.encoders import jsonify

def custom_encoder(obj: Any) -> str:
    ...

jsonify(
    'data',
    dumps_encoder=custom_encoder,
)


custom_encoder

custom_encoder: Callable | None = None — параметр Pydantic custom_encoder, передаваемый в модели Pydantic для определения пользовательского кодировщика.