2013-05-02 23:42:11 +02:00
|
|
|
import json
|
|
|
|
|
from datetime import date, datetime
|
2013-10-22 00:26:58 +02:00
|
|
|
from decimal import Decimal
|
2013-05-02 23:42:11 +02:00
|
|
|
|
|
|
|
|
from .exceptions import SerializationError
|
|
|
|
|
|
|
|
|
|
class JSONSerializer(object):
|
|
|
|
|
def default(self, data):
|
|
|
|
|
if isinstance(data, (date, datetime)):
|
|
|
|
|
return data.isoformat()
|
2013-10-22 00:26:58 +02:00
|
|
|
elif isinstance(data, Decimal):
|
|
|
|
|
return float(data)
|
2013-05-02 23:42:11 +02:00
|
|
|
raise TypeError
|
|
|
|
|
|
|
|
|
|
def loads(self, s):
|
|
|
|
|
try:
|
|
|
|
|
return json.loads(s)
|
2013-05-03 17:56:27 +02:00
|
|
|
except (ValueError, TypeError) as e:
|
2013-07-30 15:05:46 +02:00
|
|
|
raise SerializationError(s, e)
|
2013-05-02 23:42:11 +02:00
|
|
|
|
|
|
|
|
def dumps(self, data):
|
2013-06-20 14:07:09 +02:00
|
|
|
# don't serialize strings
|
|
|
|
|
if isinstance(data, (type(''), type(u''))):
|
|
|
|
|
return data
|
|
|
|
|
|
2013-05-02 23:42:11 +02:00
|
|
|
try:
|
|
|
|
|
return json.dumps(data, default=self.default)
|
2013-05-03 17:56:27 +02:00
|
|
|
except (ValueError, TypeError) as e:
|
2013-07-30 15:05:46 +02:00
|
|
|
raise SerializationError(data, e)
|
2013-05-02 23:42:11 +02:00
|
|
|
|
|
|
|
|
|