QuickstartΒΆ

Here are the supported features that Dataclass Wizard currently provides:

  • JSON (de)serialization: marshal dataclasses to/from JSON and Python dict objects.

  • Field properties: support for using properties with default values in dataclass instances.

The below is an quick demo of both of these features - how to marshal dataclasses to/from JSON and Python dict objects, and declare and use field properties with default values.

from dataclasses import dataclass, field
from datetime import datetime
from typing import Optional

from dataclass_wizard import JSONSerializable, property_wizard


@dataclass
class MyClass(JSONSerializable, metaclass=property_wizard):

    my_str: Optional[str]
    list_of_int: list[int] = field(default_factory=list)
    # You can also define this as `my_dt`, however only the annotation
    # will carry over in that case, since the value is re-declared by
    # the property below. See also the 'Using Field Properties' section
    # in the docs for a more elegant approach.
    _my_dt: datetime = datetime(2000, 1, 1)

    @property
    def my_dt(self):
        """
        A sample `getter` which returns the datetime with year set as 2010
        """
        if self._my_dt is not None:
            return self._my_dt.replace(year=2010)
        return self._my_dt

    @my_dt.setter
    def my_dt(self, new_dt: datetime):
        """
        A sample `setter` which sets the inverse (roughly) of the `month` and `day`
        """
        self._my_dt = new_dt.replace(
            month=13 - new_dt.month,
            day=31 - new_dt.day)


string = '''{"myStr": 42, "listOFInt": [1, "2", 3]}'''
# Uses the default value for `my_dt`, with year=2000, month=1, day=1
c = MyClass.from_json(string)

print(repr(c))
# prints:
#   MyClass(my_str='42', list_of_int=[1, 2, 3], my_dt=datetime.datetime(2010, 12, 30, 0, 0))

my_dict = {'My_Str': 'string', 'myDT': '2021-01-20T15:55:30Z'}
c = MyClass.from_dict(my_dict)

print(repr(c))
# prints:
#   MyClass(my_str='string', list_of_int=[], my_dt=datetime.datetime(2010, 12, 11, 15, 55, 30, tzinfo=datetime.timezone.utc))

print(c.to_json())
# prints:
#   {"myStr": "string", "listOfInt": [], "myDt": "2010-12-11T15:55:30Z"}