客户端与服务器通过json格式传输数据,通过json.dumps和json.loads方法分别可以将dict转为string,string转为dict,从而发送和解析JSON数据,十分方便。但是涉及到一些时间对象时,这两个方法便不能直接食用,可以通过加入object_hook参数和cls参数使用,方法如下:
import json
import datetime
import dateutil.parser
import decimal
CONVERTERS = {
'datetime': dateutil.parser.parse,
'decimal': decimal.Decimal,
}
class MyJSONEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, (datetime.datetime,)):
return {"val": obj.isoformat(), "_spec_type": "datetime"}
elif isinstance(obj, (decimal.Decimal,)):
return {"val": str(obj), "_spec_type": "decimal"}
else:
return super().default(obj)
def object_hook(obj):
_spec_type = obj.get('_spec_type')
if not _spec_type:
return obj
if _spec_type in CONVERTERS:
return CONVERTERS[_spec_type](obj['val'])
else:
raise Exception('Unknown {}'.format(_spec_type))
def main():
data = {
"hello": "world",
"thing": datetime.datetime.now(),
"other": decimal.Decimal(0)
}
thing = json.dumps(data, cls=MyJSONEncoder)
print(json.loads(thing, object_hook=object_hook))
if __name__ == '__main__':
main()