Skip to main content

Adds support for a couple of new Python magic methods to make Python object oriented JSON encoding and decoding a bit easier, with the following goals in mind:

  • jsonlight.dumps should always work, even if it has to fallback to a string

  • it detects if an object being dumped defines a __jsondump__ method

  • it detects if an object being dumped is of a type defined in the global typemap, or the one that’s being used

  • for complete round-tripping, the type schema is maintained in a __jsonload__ method that you must implement

Standard types

This is what you can already do in Python:

from json import loads, dumps
from uuid import UUID, uuid4

obj = uuid4()
assert obj == UUID(loads(dumps(str(obj))))

All standard Python types such as UUID must have an encode/decode method in the default typemap provided by jsonlight, so encoding to JSON should always work. However, the type must be specified on load:

from jsonlight import loads, dumps
from uuid import UUID, uuid4

obj = uuid4()
assert obj == loads(UUID, dumps(obj))

You can see that the main difference with json.loads is that jsonlight.loads requires a type as first argument. This is because jsonlight.loads will first call json.loads to convert the string into a Python object with basic JSON tyes, and then pass that to the type’s __jsonload__ function, or rely on the typemap defined functions if any.

Nested types

You may leverage the __jsondump__ and __jsonload__ methods based on the following conventions:

  • __jsondump__: return a representation of self with JSON data types

  • __jsonload__: instanciate an object based on the result from __jsondump__

Example:

from jsonlight import load

class YourClass:
    def __init__(self):
        self.now = datetime.now()

    def __jsondump__(self):
        return dict(now=self.now)

    @classmethod
    def __jsonload__(cls, data):
        return cls(load(datetime, data['now'])

As you can see:

  • you don’t have to worry about calling __jsondump__ on return values of your own __jsondump__ because jsonlight.dumps will do that recursively,

  • you have full control on deserialization just like with __setstate__, but if you call jsonlight.load in there yourself then you don’t have to duplicate deserialization logic on nested objects,

Typemaps

This lib must support all standard Python types, and it already works for things like UUID or Path because they cast fine from and to strings. However, this is not the case for datetimes and there is no JSON standard for datetimes.

Since it is a requirement for jsonlight to support all standard python types, a default typemap is also included, which makes datetimes export to string with .isoformat() and from string with .fromisoformat():

now = datetime.now()
assert now == loads(datetime, dumps(now))

This is the reason why we have typemaps. The typemap in jsonlight maps a Python type to a couple of encoding/decoding functions, so that we have something that works without monkey patching.

To illustrate how to use a specific typemap, let’s decide we want to remove the leading slash of all Path objects dumps and ensure there is one on load, we will define our own typemap:

typemap = {
    Path: (
        lambda value: str(value).lstrip('/'),
        lambda data: Path('/' + data.lstrip('/')),
    ),
}
assert dumps(Path('/foo/bar'), typemap) == '"foo/bar"'
assert loads(Path, '"foo/bar"', typemap) == Path('/foo/bar')

A couple of possibilities are left to keep in mind:

  • typemap.update(jsonlight.typemap) adds the default jsonlight typemap to your own,

  • jsonlight.typemap.update(typemap) adds your own typemap on top of the default typemap.

Release files for jsonlight 0.0.7

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for jsonlight 0.0.7
File Size Uploaded
jsonlight-0.0.7.tar.gz 3.2 kB Details

Release files / jsonlight-0.0.7.tar.gz

Download URL jsonlight-0.0.7.tar.gz
Size 3.2 kB
Tags Source
SHA-256 checksum
How to use checksums
75bb22b79cbf7335a4a6052f035901b162cc446f22841bb39479c6fb91e6bf10
BLAKE2b-256 checksum
How to use checksums
79d7e610d3f9a650562a36c1d7b77931061c2bc8226e752e8fa5d4874f315c4f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.1.1 CPython/3.12.6
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page