# This file is placed in the Public Domain.
#
# pylint: disable=C,I,R,W0622,W0108
# flake8: noqa=C901
"object json"
import json
from json import JSONDecoder, JSONEncoder
from .object import Object
def __dir__():
return (
'dumps',
'loads',
)
__all__ = __dir__()
class ObjectDecoder(JSONDecoder):
def __init__(self, *args, **kwargs):
""
JSONDecoder.__init__(self, *args, **kwargs)
def decode(self, s, _w=None):
""
val = JSONDecoder.decode(self, s)
if not val:
val = {}
return Object(val)
def raw_decode(self, s, idx=0):
""
return JSONDecoder.raw_decode(self, s, idx)
class ObjectEncoder(JSONEncoder):
def __init__(self, *args, **kwargs):
""
JSONEncoder.__init__(self, *args, **kwargs)
def default(self, o) -> str:
""
if isinstance(o, dict):
return o.items()
if isinstance(o, Object):
return vars(o)
if isinstance(o, list):
return iter(o)
if isinstance(
o,
(
type(str),
type(True),
type(False),
type(int),
type(float)
)
):
return o
try:
return JSONEncoder.default(self, o)
except TypeError:
return str(o)
def encode(self, o) -> str:
""
return JSONEncoder.encode(self, o)
def iterencode(
self,
o,
_one_shot=False
) -> str:
""
return JSONEncoder.iterencode(self, o, _one_shot)
def dump(*args, **kw) -> None:
kw["cls"] = ObjectEncoder
return json.dump(*args, **kw)
[docs]def dumps(*args, **kw) -> str:
kw["cls"] = ObjectEncoder
return json.dumps(*args, **kw)
def load(fpt, *args, **kw):
return json.load(fpt, *args, cls=ObjectDecoder, **kw )
[docs]def loads(string, *args, **kw):
return json.loads(string, *args, cls=ObjectDecoder, **kw)