StrongJson
A more faithful python json encoder/decoder.
Install
pip install strong_json
or directly from this repository
pip install git+git://github.com/piti118/strong-json.git
Features
In addition to the standard json.dumps/loads, this module offer the following additional behavior.
-
Custom class support outside the box(overridable via ToJsonable interface).
-
class User: def __init__(self, first, last): self.first = first self.last = last
-
-
Preserve type information.
User('f', 'l')->{"__type__": "User", "first":"f", "last":"l"}
-
More faithful dictionary dumps/loads
- Treat dictionary as OrderedDictionary when encode. See Python 3.6 Release Note.
{'a':'b', 'c':'d'}->{ "__type__": "dict", "__data__": [ {"key": "a", "value": "b"}, {"key": "c", "value": "d"} ] }
- Decoder will accept both traditional form(
{'a':'b','c':'d'}) and the form above.
- Allow any hashable object as key
{User('f', 'l'): 1, User('a','b'):2}->{ "__type__": "dict", "__data__": [ { "key": {"__type__": "User", "first": "f", "last":"l"}, "value": 1 }, { "key": {"__type__": "User", "first": "a", "last":"b"}, "value": 2 } ] }
- Treat dictionary as OrderedDictionary when encode. See Python 3.6 Release Note.
-
Distinguish tuple from List
[1,2,3]->[1,2,3](1,2,3)->{"__type__":"tuple", "__data__":[1,2,3]}
-
Custom class decoder whitelist via class_map
-
from strong_json import StrongJson s = {'__type__': 'User', 'first':'f', 'last':'l'} class_map = {'User', User} custom_json = StrongJson(class_map=class_map) custom_json.from_json(s)
- By default, strong json pass all the argument by name to the constructor.
- You could also override
StrongJsonor implement interfaceFromJsonablefor custom decoder. - You could also use strong_json.ClassMapBuilder to save some typing.
-
-
Support for date and datetime.
datetime.date(2019,8,23)->
{ "__type__": "date", "year": 2019, "month": 8, "day": 23 }
-
Support for Enum.
-
from enum import Enum class Color(Enum): RED='redd' BLUE='blueee' strong_json.to_json(Color.RED)
->{"__type__": "Color", "__data__":"RED"}
-
-
Support for numpy and pandas. (via
to_dictandtolist) -
nan, inf, -infare dumped as dict ex:{"__type__":"float", "__data__":"nan"}
Basic Usage
From Object to JSON
Builtin Object
from strong_json import strong_json
obj = {'a': [1,2,3], 'b':[2,3,4]}
s = strong_json.to_json(obj)
# if you want indentation you could do
s_indent = strong_json.to_json(obj, indent=2)
Custom Class
SimpleClass
Custom class works out of the box
from strong_json import strong_json
class SimpleClass:
def __init__(self, msg):
self.msg = msg
obj = SimpleClass('hello')
s = strong_json.to_json(object)
which produce json of the form
{
"__type__": "SimpleClass",
"msg": "hello"
}
Custom Encoder.
If you don't like the default class encoder you can create new one by implementing ToJsonable interface.
from strong_json import strong_json, ToJsonable
class User(ToJsonable):
def __init__(self, first, last):
self.first = first
self.last = last
# this is where the magic happens.
def to_json_dict(self, encoder: StrongJson) -> Dict[str, JSONPrimitive]:
return {
'__type__': 'User',
'first': encoder.to_json_dict(self.first),
'last': encoder.to_json_dict(self.last),
'full_name': encoder.to_json_dict(f"{self.first} {self.last}")
}
obj = User('hello', 'world')
s = strong_json.to_json(object)
which produces json of the form
{
"__type__": "User",
"first": "hello",
"last": "world",
"full_name": "hello_world"
}
From JSON to object
Builtin Object
from strong_json import strong_json
s = """{"a": "b", "c":"d"}"""
obj = strong_json.from_json(s)
Custom Class
from strong_json import StrongJson
class User: # it doesn't have to be ToJsonable
def __init__(self, first, last):
self.first = first
self.last = last
s = """
{
"__type__": "User",
"first": "hello",
"last": "world"
}
"""
class_map = {'User': User}
custom_json = StrongJson(class_map=class_map)
obj = custom_json.to_json(s, class_map)
Metadata
Release files for strong-json 1.0.11
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| strong_json-1.0.11-py3-none-any.whl | Python 3 | none | any | Details for strong_json-1.0.11-py3-none-any.whl |
Release files / strong_json-1.0.11-py3-none-any.whl
| Download URL | strong_json-1.0.11-py3-none-any.whl |
|---|---|
| Size | 9.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8c8b1ecebb16fe5a2993229593a174af101758d93b8bd039b48f5728542dd9f1
|
|
BLAKE2b-256 checksum How to use checksums |
3a0edcb1a826731404b2e0185c9bd7d9ef35efc21d518ac22156476875ccdd62
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/2.0.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.36.1 CPython/3.7.3
|
Security for strong-json 1.0.11
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.