Hello Everyone, I was working on a new use case and I continually find myself trying to clean JSON data from integrations (including converting timestamps) so I wrote this CleanJson
python class:
class CleanJson(object):
def __init__(self, data):
try:
json_data = json.dumps(data, default=self.json_serial)
self.decoded_dict = json.loads(json_data, object_hook=self.decode_dict)
except:
json_data = json.dumps(data, default=self.json_serial)
self.decoded_list = json.loads(json_data, object_hook=self.decode_dict)
def get(self):
if self.decoded_dict:
return self.decoded_dict
elif self.decoded_list:
return self.decoded_list
def json_serial(self, obj):
"""JSON serializer for objects not serializable by default json code"""
if isinstance(obj, date) or isinstance(obj, datetime):
return obj.isoformat()
raise TypeError ("Type %s not serializable" % type(obj))
def decode_list(self, data):
rv = []
for item in data:
if isinstance(item, unicode):
item = item.encode('utf-8')
elif isinstance(item, list):
item = self.decode_list(item)
elif isinstance(item, dict):
item = self.decode_dict(item)
rv.append(item)
return rv
def decode_dict(self, data):
rv = {}
for key, value in data.iteritems():
if isinstance(key, unicode):
key = key.encode('utf-8')
if isinstance(value, unicode):
value = value.encode('utf-8')
elif isinstance(value, list):
value = self.decode_list(value)
elif isinstance(value, dict):
value = self.decode_dict(value)
rv[key] = value
return rv
You can call it by just passing in return data from an integration or another method:
data = CleanJson(call_some_integration_method(var1, var2))
And it will return clean json
Enjoy!