Select Git revision
serializer.py
serializer.py 1.63 KiB
'''
Created on 6 févr. 2018
@author: arrivault
'''
import numpy as np
import json
class Serializer(object):
'''
classdocs
'''
def __serialize(self, data):
if data is None or isinstance(data, (bool, int, float, str)):
return data
if isinstance(data, list):
return [self.__serialize(val) for val in data]
if isinstance(data, dict):
if all(isinstance(k, str) for k in data):
return {k: self.__serialize(v) for k, v in data.items()}
return {"py/dict": [[self.__serialize(k), self.__serialize(v)] for k, v in data.items()]}
if isinstance(data, tuple):
return {"py/tuple": [self.__serialize(val) for val in data]}
if isinstance(data, set):
return {"py/set": [self.__serialize(val) for val in data]}
if isinstance(data, np.ndarray):
return {"py/numpy.ndarray": {
"values": data.tolist(),
"dtype": str(data.dtype)}}
raise TypeError("Type %s not data-serializable" % type(data))
def __restore(self, dct):
if "py/dict" in dct:
return dict(dct["py/dict"])
if "py/tuple" in dct:
return tuple(dct["py/tuple"])
if "py/set" in dct:
return set(dct["py/set"])
if "py/numpy.ndarray" in dct:
data = dct["py/numpy.ndarray"]
return np.array(data["values"], dtype=data["dtype"])
return dct
def data_to_json(self, data):
return json.dumps(self.__serialize(data))
def json_to_data(self, s):
return json.loads(s, object_hook=self.__restore)