Skip to main content

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


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)

Uploaded Source

Built Distribution

serial_json-1.2.7-py3-none-any.whl (59.8 kB view details)

Uploaded Python 3

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

Hashes for serial_json-1.2.7.tar.gz
Algorithm Hash digest
SHA256 596f886ed158c741ebb3364f320059a8e739dd66f667ed6ffff3ed6f15654c8b
MD5 6f60514ba0dd6a006a78699a813c8ce4
BLAKE2b-256 2c330896e89bfc8088766af38ff69b5e1c7a6cc9fbf2304eae03d2a0c70761f5

See more details on using hashes here.

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

Hashes for serial_json-1.2.7-py3-none-any.whl
Algorithm Hash digest
SHA256 1680f4d2ddf8ea063a4c61fdba67e1edaef432b8c4914441f3c25f33a32b3733
MD5 ae69af6e7837b71f39d51cc4eff7945e
BLAKE2b-256 6c92493fdce4782231747aa8b82c3e87d9e5709ab4178763657b657c7965af95

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