The module allows you serialize your python complex objects to json and deserialize it.
To install, you can use the command:
pip install ComplexJSON
Or Download the repository from GitHub.
Just use it like python builtin json module
import ComplexJSON
...
json_obj = ComplexJSON.dumps(obj)
...
new_obj = ComplexJSON.loads(json_obj)If you use this code:
import ComplexJSON
...
a = [1, 2, 3]
b = [a, a]
c = ComplexJSON.dumps(b)
b = ComplexJSON.loads(c)you will get multiple objects instead of 1 object with multiple links:
b[0].pop()
print(b)
>>> [[1, 2], [1, 2, 3]]Although you might expect:
>>> [[1, 2], [1, 2]]There are variants of usage:
import ComplexJSON
...
json_obj = ComplexJSON.dumps(obj)
new_obj = ComplexJSON.loads(json_obj)
...
# or
with open("test.json", "wt", encoding="Utf-8") as f:
ComplexJSON.dump(obj, f)
...
with open("test.json", "rt", encoding="Utf-8") as f:
new_obj = ComplexJSON.load(json_obj, f)
# or
import json
json_obj = json.dumps(obj, cls=ComplexJSON.ComplexJSONEncoder)
new_obj = json.loads(json_obj, cls=ComplexJSON.ComplexJSONDecoder)
# or
import json
with open("test.json", "wt", encoding="Utf-8") as f:
json.dump(obj, f, cls=ComplexJSON.ComplexJSONEncoder)
...
with open("test.json", "rt", encoding="Utf-8") as f:
new_obj = json.load(json_obj, f, cls=ComplexJSON.ComplexJSONDecoder)By default, the codewords for the module and class are "__module__" and "__class__", respectively
class A:
def __init__(self):
self.a = 1
self.b = 2Object of this class will be serialized as:
{"a": 1, "b": 2, "__module__": "__main__", "__class__": "A"}But you can change the codewords for module and class:
from ComplexJSON import vardef
vardef.classword = "_c_"
vardef.moduleword = "_m_"Or
import ComplexJSON
ComplexJSON.vardef.classword = "_c_"
ComplexJSON.vardef.moduleword = "_m_"And now A class will be serialized as:
{"a": 1, "b": 2, "_m_": "__main__", "_c_": "A"}from ComplexJSON import vardef
vardef.classword = None # remove classword from json
vardef.moduleword = None # remove moduleword from jsonIf you remove both, object will be decoded as python dict. If you remove moduleword, you need to provide class in classStorage argument in load, loads or ComplexJSONDecoder
import ComplexJSON as json
json.vardef.moduleword = None
class A:
b = 1
...
classStorage = [A]
# or
classStorage = {"A": A}
...
json.loads(obj, classStorage=classStorage)
# or
decoder = json.ComplexJSONDecoder(classStorage=classStorage)
...
decoder.decode(obj)
# or
json.loads(obj, object_hook=decoder.object_hook)import ComplexJSON as json
...
_json = json.dumps(obj, localClassWord="Type", localModuleWord="Module")
new_obj = json.loads(_json, localClassWord="Type", localModuleWord="Module")import ComplexJSON
class A:
def __init__(self):
self.a = 1
self.b = 2
rs = {1: A()}
json_obj = ComplexJSON.dumps(rs, useTypeAssociation=True)
print(json_obj)
#>>> {"types": {".": {"useTA": true}, "0": {"__module__": "__main__", "__class__": "A"}}, "obj": {"1": {"a": 1, "b": 2, "__cid__": "0"}}}
print(ComplexJSON.loads(json_obj))
#>>> {'1': <__main__.A object at 0x00000154D6013490>}