From 2665fdd5e31bc1e30ce5adfb9176ba26f7f2e9bc Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Tue, 16 Jul 2019 12:56:38 +0200 Subject: [PATCH] jsonify test complete, approach seems to work --- snippets/test8.py | 55 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 48 insertions(+), 7 deletions(-) diff --git a/snippets/test8.py b/snippets/test8.py index 3d79d33..d50bdab 100644 --- a/snippets/test8.py +++ b/snippets/test8.py @@ -10,9 +10,27 @@ class A(object): def __str__(self): return "A: {0!s} {1!s} {2!s}".format(self.arg1, self.arg2, self.arg3) - def toJSON(self): - return json.DUMPS({'type':self.__class__.__name__, 'args': {'arg1':self.arg1, 'arg2':self.arg2}}) + def jsonify(self): + return {'type':self.__class__.__name__, 'args': {'arg1':self.arg1, 'arg2':self.arg2}} +class MyEncoder(json.JSONEncoder): + def default(self, o): + try: + return o.jsonify() + except TypeError or AttributeError: + return super().default(o) + + +def objectFactory(j): + klass = eval(j['type']) + o = klass(**j['args']) + return o + +def MyDecoder(j): + if type(j) == dict and 'type' in j: + return objectFactory(j) + else: + return j class Tests(unittest.TestCase): def test_a1(self): @@ -47,16 +65,39 @@ class Tests(unittest.TestCase): self.assertEqual(a3.arg2, 5) self.assertEqual(a3.arg3, 8) - jjjj = json.dumps(a3) - print(jjjj) - jj = json.loads(jjjj) - klass = eval(jj['type']) + jjjj = json.dumps(a3, cls=MyEncoder) + + jjj = json.loads(jjjj) + klass = eval(jjj['type']) self.assertEqual(A, klass) - a3 = klass(**jj['args']) + a3 = klass(**jjj['args']) self.assertEqual(a3.arg1, 3) self.assertEqual(a3.arg2, 5) self.assertEqual(a3.arg3, 8) + def test_a5(self): + jList = [] + jList.append(objectFactory({'type':'A', 'args': {'arg1':1, 'arg2':2}})) + jList.append(objectFactory({'type':'A', 'args': {'arg1':2, 'arg2':3}})) + jList.append(objectFactory({'type':'A', 'args': {'arg1':3, 'arg2':4}})) + + js = json.dumps(jList, cls=MyEncoder, sort_keys=True, indent=4) + + print(js) + + jResultList = json.loads(js, object_hook=MyDecoder) + + self.assertEqual(jResultList[0].arg1, 1) + self.assertEqual(jResultList[0].arg2, 2) + self.assertEqual(jResultList[0].arg3, 3) + + self.assertEqual(jResultList[1].arg1, 2) + self.assertEqual(jResultList[1].arg2, 3) + self.assertEqual(jResultList[1].arg3, 5) + + self.assertEqual(jResultList[2].arg1, 3) + self.assertEqual(jResultList[2].arg2, 4) + self.assertEqual(jResultList[2].arg3, 7)