TypeError: datetime.datetime(2016, 9, 25, 21, 12, 19, 135649) is not JSON serializable解决办法(json无法序列化对象的解决办法)
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)
作者:沐禹辰
出处:http://www.cnblogs.com/renfanzi/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
出处:http://www.cnblogs.com/renfanzi/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。