Skip to main content

Marshal dataclasses to/from JSON. Use field properties with initial values. Construct a dataclass schema with JSON input.

Project description

https://img.shields.io/pypi/v/dataclass-wizard.svg https://img.shields.io/pypi/pyversions/dataclass-wizard.svg https://travis-ci.com/rnag/dataclass-wizard.svg?branch=main Documentation Status Updates

This library provides a set of simple, yet elegant wizarding tools for interacting with the Python dataclasses module.

Full documentation is at:

Features

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.

  • JSON to Dataclass generation: construct a dataclass schema with a JSON file or string input.

Usage

Using the built-in JSON marshalling support for dataclasses:

from dataclasses import dataclass, field
from typing import Optional, List, Tuple

from dataclass_wizard import JSONWizard


@dataclass
class MyClass(JSONWizard):
    my_str: Optional[str]
    is_active_tuple: Tuple[bool, ...]
    list_of_int: List[int] = field(default_factory=list)


string = """
{
  "my_str": 20,
  "ListOfInt": ["1", "2", 3],
  "isActiveTuple": ["true", "false", 1, false]
}
"""

c = MyClass.from_json(string)
print(repr(c))
# prints:
#   MyClass(my_str='20', is_active_tuple=(True, False, True, False), list_of_int=[1, 2, 3])

print(c.to_json())
# prints:
#   {"myStr": "20", "isActiveTuple": [true, false, true, false], "listOfInt": [1, 2, 3]}

… and with the property_wizard, which provides support for field properties with default values in dataclasses:

from dataclasses import dataclass, field
from typing import Union
from typing_extensions import Annotated

from dataclass_wizard import property_wizard


@dataclass
class Vehicle(metaclass=property_wizard):
    # Note: The example below uses the default value from the `field` extra in
    # the `Annotated` definition; if `wheels` were annotated as a `Union` type,
    # it would default to 0, because `int` appears as the first type argument.
    #
    # Any right-hand value assigned to `wheels` is ignored as it is simply
    # re-declared by the property; here it is simply omitted for brevity.
    wheels: Annotated[Union[int, str], field(default=4)]

    # This is a shorthand version of the above; here an IDE suggests
    # `_wheels` as a keyword argument to the constructor method, though
    # it will actually be named as `wheels`.
    # _wheels: Union[int, str] = 4

    @property
    def wheels(self) -> int:
        return self._wheels

    @wheels.setter
    def wheels(self, wheels: Union[int, str]):
        self._wheels = int(wheels)


if __name__ == '__main__':
    v = Vehicle()
    print(v)
    # prints:
    #   Vehicle(wheels=4)

    v = Vehicle(wheels=3)
    print(v)

    v = Vehicle('6')
    print(v)

    assert v.wheels == 6, 'The constructor should use our setter method'

    # Confirm that we go through our setter method
    v.wheels = '123'
    assert v.wheels == 123

… or generate a dataclass schema for JSON input, via the wiz-cli tool:

$ echo '{"myFloat": "1.23", "created_at": "2021-11-17"}' | wiz gs - my_file

# Contents of my_file.py
from dataclasses import dataclass
from datetime import date
from typing import Union

from dataclass_wizard import JSONWizard


@dataclass
class Data(JSONWizard):
    """
    Data dataclass

    """
    my_float: Union[float, str]
    created_at: date

Installing Dataclass Wizard and Supported Versions

The Dataclass Wizard library is available on PyPI:

$ python -m pip install dataclass-wizard

The dataclass-wizard library officially supports Python 3.6 or higher.

JSON Marshalling

JSONSerializable (aliased to JSONWizard) is a Mixin class which provides the following helper methods that are useful for serializing (and loading) a dataclass instance to/from JSON, as defined by the AbstractJSONWizard interface.

Method

Example

Description

from_json

item = Product.from_json(string)

Converts a JSON string to an instance of the dataclass, or a list of the dataclass instances.

from_list

list_of_item = Product.from_list(l)

Converts a Python list object to a list of the dataclass instances.

from_dict

item = Product.from_dict(d)

Converts a Python dict object to an instance of the dataclass.

to_dict

d = item.to_dict()

Converts the dataclass instance to a Python dict object that is JSON serializable.

to_json

string = item.to_json()

Converts the dataclass instance to a JSON string representation.

Additionally, it adds a default __str__ method to subclasses, which will pretty print the JSON representation of an object; this is quite useful for debugging purposes. Whenever you invoke print(obj) or str(obj), for example, it’ll call this method which will format the dataclass object as a prettified JSON string. If you prefer a __str__ method to not be added, you can pass in str=False when extending from the Mixin class as mentioned here.

Note that the __repr__ method, which is implemented by the dataclass decorator, is also available. To invoke the Python object representation of the dataclass instance, you can instead use repr(obj) or f'{obj!r}'.

To mark a dataclass as being JSON serializable (and de-serializable), simply sub-class from JSONSerializable as shown below. You can also extend from the aliased name JSONWizard, if you prefer to use that instead.

Check out a more complete example of using the JSONSerializable Mixin class.

Field Properties

The Python dataclasses library has some key limitations with how it currently handles properties and default values.

The dataclass-wizard package natively provides support for using field properties with default values in dataclasses. The main use case here is to assign an initial value to the field property, if one is not explicitly passed in via the constructor method.

To use it, simply import the property_wizard helper function, and add it as a metaclass on any dataclass where you would benefit from using field properties with default values. The metaclass also pairs well with the JSONSerializable mixin class.

For more examples and important how-to’s on properties with default values, refer to the Using Field Properties section in the documentation.

Credits

This package was created with Cookiecutter and the rnag/cookiecutter-pypackage project template.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dataclass-wizard-0.10.0.tar.gz (94.7 kB view details)

Uploaded Source

Built Distribution

dataclass_wizard-0.10.0-py2.py3-none-any.whl (61.7 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file dataclass-wizard-0.10.0.tar.gz.

File metadata

  • Download URL: dataclass-wizard-0.10.0.tar.gz
  • Upload date:
  • Size: 94.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.0

File hashes

Hashes for dataclass-wizard-0.10.0.tar.gz
Algorithm Hash digest
SHA256 78bd26675b53b9cbd85bca0076e4e0a76cea7a697a6d6172a5b3c053602b2df4
MD5 47e559fcb322a71a3885c716e39d7fd4
BLAKE2b-256 99926dbaf01709f2aa00d699d9fff49b16b77e8b386f9901ab476cbd10979ccf

See more details on using hashes here.

File details

Details for the file dataclass_wizard-0.10.0-py2.py3-none-any.whl.

File metadata

  • Download URL: dataclass_wizard-0.10.0-py2.py3-none-any.whl
  • Upload date:
  • Size: 61.7 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.0

File hashes

Hashes for dataclass_wizard-0.10.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 4cf21533c87f74cc4b6b06ae2f00c2f851d04ca174b6ba92316aaad9ae16cc3a
MD5 e3d8ab9d7aa99f98785326f7f80cb10b
BLAKE2b-256 28ae039e7be9a15e35c90f399dbf2cba38ff99d6dfd3f12fafd834170d52a128

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page