Quickly serialize dataclasses to and from JSON
Project description
Fastclasses JSON
Inspired by Dataclasses JSON. This library attempts provide some basic functionality for encoding and decoding dataclasses with close to hand-written performance characteristics for large datasets.
from dataclasses import dataclass
from fastclasses_json import dataclass_json
@dataclass_json
@dataclass
class SimpleExample:
str_field: str
SimpleExample.from_dict({'str_field': 'howdy!'})
SimpleExample.from_json('{"str_field": "howdy!"}')
# SimpleExample(str_field='howdy!')
SimpleExample('hi!').to_dict()
# {'str_field': 'hi!'}
SimpleExample('hi!').to_json()
# '{"str_field":"hi!"}'
Supported Types
typing.List[T]
whereT
is also decorated with@dataclass_json
typing.Optional[T]
typing.Optional[typing.List[T]]
typing.List[typing.Optional[T]]
typing.List[typing.List[typing.List[T]]]
etctyping.Dict[str, T]
enum.Enum
subclassesdatetime.date
anddatetime.datetime
as ISO8601 format stringsdecimal.Decimal
as stringsuuid.UUID
as strings- Mutually recursive dataclasses.
any other types will just be left as is
from __future__ import annotations
from typing import Optional, List
@dataclass_json
@dataclass
class Russian:
doll: Optional[Doll]
@dataclass_json
@dataclass
class Doll:
russian: Optional[Russian]
Russian.from_dict({'doll': {'russian': {'doll': None}}})
# Russian(doll=Doll(russian=Russian(doll=None)))
Russian(Doll(Russian(None))).to_dict()
# {'doll': {'russian': {}}}
from enum import Enum
class Mood(Enum):
HAPPY = 'json'
SAD = 'xml'
@dataclass_json
@dataclass
class ILikeEnums:
maybe_moods: Optional[List[Mood]]
ILikeEnums.from_dict({}) # ILikeEnums(maybe_moods=None)
ILikeEnums.from_dict({'maybe_moods': ['json']}) # ILikeEnums(maybe_moods=[Mood.HAPPY])
ILikeEnums(maybe_moods=[Mood.HAPPY]).to_dict() # {'maybe_moods': ['json']}
from datetime import date
@dataclass_json
@dataclass
class Enitnelav:
romantic: date
Enitnelav.from_dict({'romantic': '2021-06-17'}) # Enitnelav(romantic=datetime.date(2021, 6, 17))
Enitnelav(romantic=date(2021, 6, 17)).to_dict() # {'romantic': '2021-06-17'}
from decimal import Decimal
from uuid import UUID
@dataclass_json
@dataclass
class TaxReturn:
number: UUID
to_pay: Decimal # 😱
TaxReturn.from_dict({'number': 'e10be89e-938f-4b49-b4cf-9765f2f15298', 'to_pay': '0.01'})
# TaxReturn(number=UUID('e10be89e-938f-4b49-b4cf-9765f2f15298'), to_pay=Decimal('0.01'))
TaxReturn(UUID('e10be89e-938f-4b49-b4cf-9765f2f15298'), Decimal('0.01')).to_dict()
# {'number': 'e10be89e-938f-4b49-b4cf-9765f2f15298', 'to_pay': '0.01'}
we are not a drop-in replacement for Dataclasses JSON. There are plenty of cases to use this in spite.
Type checking (i.e. using mypy)
If using type annotations in your code, you may notice type errors when type
checking classes that use the @dataclass_json
decorator.
% mypy tests/for_type_checking.py
tests/for_type_checking.py:27: error: "A" has no attribute "to_json"
tests/for_type_checking.py:28: error: "Type[A]" has no attribute "from_dict"
There are two techniques for overcoming this, one which is simpler but likely to break or be unstable between versions of python and mypy; and one which is a bit more work on your part.
Mypy plugin
Changes in python and mypy are likely to lead to a game of cat and mouse, but
for the moment, we have a plugin that you can configure in your setup.cfg
% cat setup.cfg
[mypy]
plugins = fastclasses_json.mypy_plugin
Mixin with stub methods
There is a mixin containing stub methods for converting to and from dicts and JSON. This can be useful if the mypy plugin breaks or if you are using a different type checker.
from dataclasses import dataclass
from fastclasses_json import dataclass_json, JSONMixin
@dataclass_json
@dataclass
class SimpleTypedExample(JSONMixin):
what_a_lot_of_hassle_these_types_eh: str
print(SimpleTypedExample.from_dict({'what_a_lot_of_hassle_these_types_eh': 'yes'}))
% mypy that_listing_above.py
Success: no issues found in 1 source file
Notice that you have to use both the @dataclass_json
decorator and the
JSONMixin
mixin. How very annoying!
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for fastclasses_json-0.1.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ce92f685da6879f0c9cb737649cddffe296d53429176dd0bb9a6604d0c4dc326 |
|
MD5 | b9956c3505a873423825b3e4902e0b29 |
|
BLAKE2b-256 | 4dcea40322b953d43bd837a9340b692b165cd5ae389852936e5e52941544c39f |