Custom json serialization support.
Project description
Easily add custom JSON serialization
Code Example
Defaults
import serial_json as json
import datetime
value = b'Hello World!' # Bytes are not supported by json normally
assert json.loads(json.dumps(value)) == value
dt = datetime.datetime.now() # datetimes are not supported by json normally
assert json.loads(json.dumps(dt)) == dt
Custom
Custom serialization using a classes __getstate__ and __setstate__ methods.
import serial_json as json
@json.register
class MyClass(object):
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def __eq__(self, other):
"""Compare objects."""
try:
return self.x == other.x and self.y == other.y
except (AttributeError, Exception):
return False
def __getstate__(self):
return {'x': self.x, 'y': self.y}
def __setstate__(self, state):
self.x = state.get('x', 0)
self.y = state.get('y', 0)
my_value = MyClass()
assert json.loads(json.dumps(my_value)) == my_value
Custom serialization with functions instead of a class with getstate and setstate.
import serial_json
class MyClass(object):
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def __eq__(self, other):
"""Compare objects."""
try:
return self.x == other.x and self.y == other.y
except (AttributeError, Exception):
return False
def cls_to_dict(obj):
return {'x': obj.x, 'y': obj.y}
def cls_from_dict(obj):
return MyClass(**obj)
# Register the serialize and deserialize functions
serial_json.register(MyClass, cls_to_dict, cls_from_dict)
my_value = MyClass()
assert serial_json.loads(serial_json.dumps(my_value)) == my_value
dataclass
Dataclasses can be used through inheritance with DataClass or through the decorator dataclass.
import serial_json
from serial_json import dataclass, field_property, field
@dataclass
class Point:
x: int
y: int
z: int = field(default=0, skip_repr=0, skip_dict=0) # Do not include in repr if value is 0
help(Point)
# p = Point() # Raises error for required positional arguments
p = Point(1, 2)
assert p.x == 1
assert p.y == 2
assert p.z == 0
class Location(serial_json.DataClass):
name: str
point: Point = Point(0, 0, 0)
@field_property(default=Point(1, 1, 0))
def point2(self):
return self._point2
@point2.setter
def point2(self, value):
if isinstance(value, (list, tuple)) and len(value) >= 2:
value = Point(*value)
elif isinstance(value, dict):
value = Point(**value)
if not isinstance(value, Point):
raise TypeError('Given value must be a Point!')
self._point2 = value
help(Location)
l = Location('hello')
assert l.name == 'hello'
assert l.point == Point(0, 0, 0)
assert l.point2 == Point(1, 1, 0)
l2 = Location('111', point=Point(x=1, y=1, z=1), point2=(2, 2, 0))
assert l2.name == '111'
assert l2.point == Point(1, 1, 1)
assert l2.point2 == Point(2, 2, 0)
assert str(l2) == 'Location(name=111, point=Point(x=1, y=1, z=1), point2=Point(x=2, y=2))' # skip repr
datetime property
Additional datetime, date, time, and weekdays properties are available
import datetime
from serial_json import dataclass, datetime_property, Weekdays, weekdays_property, weekdays_attr_property
@dataclass
class Item:
created_on: datetime.datetime = datetime_property('created_on', default_factory=datetime.datetime.now)
weekdays: Weekdays = weekdays_property('weekdays', default=Weekdays())
sunday = weekdays_attr_property('weekdays', 'sunday')
monday = weekdays_attr_property('weekdays', 'monday')
tuesday = weekdays_attr_property('weekdays', 'tuesday')
wednesday = weekdays_attr_property('weekdays', 'wednesday')
thursday = weekdays_attr_property('weekdays', 'thursday')
friday = weekdays_attr_property('weekdays', 'friday')
saturday = weekdays_attr_property('weekdays', 'saturday')
it = Item(weekdays='monday')
assert it.created_on is not None
assert it.created_on >= datetime.datetime.today().replace(hour=0)
assert 'monday' in it.weekdays
assert 'sunday' not in it.weekdays
assert it.monday
assert not it.sunday
it = Item(weekdays=[], friday=True)
assert it.created_on is not None
assert it.created_on >= datetime.datetime.today().replace(hour=0)
assert 'friday' in it.weekdays
assert 'sunday' not in it.weekdays
assert it.friday
assert not it.sunday
it = Item(sunday=False)
assert it.created_on is not None
assert it.created_on >= datetime.datetime.today().replace(hour=0)
assert 'friday' in it.weekdays, it.weekdays
assert 'sunday' not in it.weekdays, it.weekdays
assert it.friday
assert not it.sunday
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
serial_json-1.2.7.tar.gz
(17.2 kB
view details)
Built Distribution
File details
Details for the file serial_json-1.2.7.tar.gz
.
File metadata
- Download URL: serial_json-1.2.7.tar.gz
- Upload date:
- Size: 17.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.41.1 CPython/3.6.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 596f886ed158c741ebb3364f320059a8e739dd66f667ed6ffff3ed6f15654c8b |
|
MD5 | 6f60514ba0dd6a006a78699a813c8ce4 |
|
BLAKE2b-256 | 2c330896e89bfc8088766af38ff69b5e1c7a6cc9fbf2304eae03d2a0c70761f5 |
File details
Details for the file serial_json-1.2.7-py3-none-any.whl
.
File metadata
- Download URL: serial_json-1.2.7-py3-none-any.whl
- Upload date:
- Size: 59.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.41.1 CPython/3.6.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1680f4d2ddf8ea063a4c61fdba67e1edaef432b8c4914441f3c25f33a32b3733 |
|
MD5 | ae69af6e7837b71f39d51cc4eff7945e |
|
BLAKE2b-256 | 6c92493fdce4782231747aa8b82c3e87d9e5709ab4178763657b657c7965af95 |