Skip to main content

JSON Decoder and Encoder with type information.

Project description

StrongJson

Build Status

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 additonal behavior.

  • Simple interface to allow class to dump to json.

    • class User(ToJsonable):
          def __init__(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
                }
            ]
        }        
        
  • 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

    • s = {'__type__': 'User', 'first':'f', 'last':'l'}
      class_map = {'User', User}
      strong_json.from_json(s, class_map)
      
    • By default, strong json pass all the argument by name to the constructor.
    • You could also override StrongJson or implement interface FromJsonable for 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', 
        '__data__':{
            'year': 2019, 'month': 8, 'day': 23
        }
    }
    
  • Support for Enum.

    • class Color(Enum):
        RED='redd'
        BLUE='blueee
      strong_json.to_json(Color.RED)
      
      ->
      {'__type__': 'Color' '__data__':'RED'}
      

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

from strong_json import strong_json, ToJsonable

class User(ToJsonable):
    def __init__(self, first, last):
        self.first = first
        self.last = last

obj = {'a': User('a', 'aa'), 'b':User('b', 'bb')}
s = strong_json.to_json(object)

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 strong_json, ToJsonable

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}
obj = strong_json.to_json(s, class_map)

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

strong_json-1.0.0.tar.gz (10.1 kB view details)

Uploaded Source

Built Distribution

strong_json-1.0.0-py3-none-any.whl (6.6 kB view details)

Uploaded Python 3

File details

Details for the file strong_json-1.0.0.tar.gz.

File metadata

  • Download URL: strong_json-1.0.0.tar.gz
  • Upload date:
  • Size: 10.1 kB
  • Tags: Source
  • Uploaded using 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

File hashes

Hashes for strong_json-1.0.0.tar.gz
Algorithm Hash digest
SHA256 aabb10732e7df46fa8748376e4008dd6682d0415a96dc31690e04abd474a701c
MD5 74679ff64ce170b02995f399282d63f8
BLAKE2b-256 a0973f0b6b6df99a4b5137ca4984a72ae37b4cb3746ce5d61cd54ba7289e43ce

See more details on using hashes here.

File details

Details for the file strong_json-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: strong_json-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 6.6 kB
  • Tags: Python 3
  • Uploaded using 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

File hashes

Hashes for strong_json-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0c9793e63fdbd584343c3e550f833817484825fdb98d3a7a7c59290ae3f3b537
MD5 8e4ca82abf525783adab5c423d4216c7
BLAKE2b-256 debfba2548cad1e010d90a3ce7ff8f8510f1846145c366acd3d9c9425d2e0b9a

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