Types
Here is the list of the supported types. See the simple example for each type in the footnotes
- Primitives (int, float, str, bool) 1
- Containers
list
,set
,tuple
,dict
2frozenset
, 3defaultdict
4
typing.Optional
5typing.Union
6 7 8- User defined class with
@dataclass
9 10 typing.NewType
for primitive types 11typing.Any
12typing.Literal
13typing.Generic
14typing.ClassVar
15typing.InitVar
16Enum
andIntEnum
17- Standard library
- PyPI library
numpy
types 23SQLAlchemy
Declarative Dataclass Mapping (experimental) 24
You can write pretty complex class like this:
@serde
class bar:
i: int
@serde
class Foo:
a: int
b: list[str]
c: tuple[int, float, str, bool]
d: dict[str, list[tuple[str, int]]]
e: str | None
f: Bar
Numpy
All of the above (de)serialization methods can transparently handle most numpy types with the "numpy" extras package.
import numpy as np
import numpy.typing as npt
@serde
class NPFoo:
i: np.int32
j: np.int64
f: np.float32
g: np.float64
h: np.bool_
u: np.ndarray
v: npt.NDArray
w: npt.NDArray[np.int32]
x: npt.NDArray[np.int64]
y: npt.NDArray[np.float32]
z: npt.NDArray[np.float64]
npfoo = NPFoo(
np.int32(1),
np.int64(2),
np.float32(3.0),
np.float64(4.0),
np.bool_(False),
np.array([1, 2]),
np.array([3, 4]),
np.array([np.int32(i) for i in [1, 2]]),
np.array([np.int64(i) for i in [3, 4]]),
np.array([np.float32(i) for i in [5.0, 6.0]]),
np.array([np.float64(i) for i in [7.0, 8.0]]),
)
>>> from serde.json import to_json, from_json
>>> to_json(npfoo)
'{"i": 1, "j": 2, "f": 3.0, "g": 4.0, "h": false, "u": [1, 2], "v": [3, 4], "w": [1, 2], "x": [3, 4], "y": [5.0, 6.0], "z": [7.0, 8.0]}'
>>> from_json(NPFoo, to_json(npfoo))
NPFoo(i=1, j=2, f=3.0, g=4.0, h=False, u=array([1, 2]), v=array([3, 4]), w=array([1, 2], dtype=int32), x=array([3, 4]), y=array([5., 6.], dtype=float32), z=array([7., 8.]))
SQLAlchemy Declarative Dataclass Mapping (experimental)
While experimental support for SQLAlchemy Declarative Dataclass Mapping integration has been added, certain features such as @serde(type_check=strict)
and serde.field()
are not currently supported.
It's recommended to exercise caution when relying on experimental features in production environments. It's also advisable to thoroughly test your code and be aware of potential limitations or unexpected behavior.
Needs a new type support?
If you need to use a type which is currently not supported in the standard library, please creat a Github issue to request. For types in third party python packages, unless it's polular like numpy, we don't plan to support it to keep pyserde as simple as possible. We recommend to use custom class or field serializer.
See examples/any.py