1.一个简单的方法来修补json模块,这样序列将支持日期时间。
import json import datetime json.JSONEncoder.default = lambda self, obj: (obj.isoformat() if isinstance(obj, datetime.datetime) else None) result = json.dumps(ret) print(result)
[{"date": "2016-09-25T21:12:19.135649", "id": 16}]
2.该模块为您提供了一个默认的编码器:json.JSONEncoder
。您需要扩展这个提供您的实现default
方法序列化对象。
import json import datetime from time import mktime # # class MyEncoder(json.JSONEncoder): # def default(self, obj): # if isinstance(obj, datetime.datetime): # return str(mktime(obj.timetuple())) # # return json.JSONEncoder.default(self, obj) # result = json.dumps(ret, cls = MyEncoder)
[{"date": "1474809139.0", "id": 16}]
方法3:我最喜欢的, 同时可以更好的应用于tornado的序列格式化
解决办法:
from decimal import Decimal import datetime, json class ComplexEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime.datetime): return obj.strftime("%Y-%m-%d %H:%M:%S") elif isinstance(obj, Decimal): return str(obj) else: # return json.JSONEncoder.default(self, obj)
return str(obj) # 根据需求进行修改 if __name__ == '__main__': data = [{"ProjectName": "测试", "UserID": datetime.datetime.now(), "ProjectCreateTime": "2017-12-18 15:15", "ProjectPublic": "1", "ProjectOrgan": Decimal(12323)}] print(data) print(json.dumps(data, cls=ComplexEncoder, ensure_ascii=False))
res = SelectProInfor(UserID) for i in res: print(i) for k, va in i.items(): if isinstance(va, decimal.Decimal): i[k] = str(va) if isinstance(va, object): i[k] = str(va)