cozyweboob/tools/jsonwriter.py

43 lines
1.2 KiB
Python

"""
This module implements a custom JSON writer to be able to serialize data
returned by Weboob and pretty print the output JSON.
Based upon
http://stackoverflow.com/questions/11875770/how-to-overcome-datetime-datetime-not-json-serializable-in-python.
"""
import json
from datetime import date, datetime
from decimal import Decimal
class CustomJSONEncoder(json.JSONEncoder):
"""
Custom JSONEncoder to support more types.
"""
def default(self, o):
if isinstance(o, datetime) or isinstance(o, date):
# Serialize datetime objects to ISO dates
return o.isoformat()
elif isinstance(o, Decimal):
# Serialize Decimal objects to string
return str(o)
elif isinstance(o, Exception):
# Serialize Exception objects to string representation
return repr(o)
return json.JSONEncoder.default(self, o)
def pretty_json(obj):
"""
Pretty printing of JSON output, using the custom JSONEncoder.
Args:
obj: the object to JSON serialize.
Returns:
the pretty printed JSON string.
"""
return json.dumps(obj, sort_keys=True,
indent=4, separators=(',', ': '),
cls=CustomJSONEncoder)