Source code for worldline.connect.sdk.json.default_marshaller
from json import dumps, loads
from typing import Any, Type, Union
from .marshaller import Marshaller, T
from .marshaller_syntax_exception import MarshallerSyntaxException
from worldline.connect.sdk.domain.data_object import DataObject
[docs]
class DefaultMarshaller(Marshaller):
"""
Marshaller implementation based on json.
"""
[docs]
@staticmethod
def instance() -> 'DefaultMarshaller':
return _DEFAULT_MARSHALLER_INSTANCE
[docs]
def marshal(self, request_object: Any) -> str:
if isinstance(request_object, DataObject):
dictionary = request_object.to_dictionary()
return dumps(dictionary,
default=lambda o: o.to_dictionary(),
indent=4)
else:
return dumps(request_object,
default=lambda o: o.__dict__,
indent=4)
[docs]
def unmarshal(self, response_json: Union[str, bytes, None], type_class: Type[T]) -> T:
if not response_json:
return None
if issubclass(type_class, DataObject):
try:
return type_class().from_dictionary(loads(response_json))
except ValueError as e:
raise MarshallerSyntaxException(e) from e
class Object(object):
pass
def convert_to_object(d):
try:
d = dict(d)
except (TypeError, ValueError):
return d
o = Object()
for key, value in d.items():
o.__dict__[key] = convert_to_object(value)
return o
try:
dictionary = loads(response_json)
converted_object = convert_to_object(dictionary)
return converted_object
except ValueError as e:
raise MarshallerSyntaxException(e) from e
_DEFAULT_MARSHALLER_INSTANCE = DefaultMarshaller()