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)

 

posted @ 2016-09-25 21:47  我当道士那儿些年  阅读(1768)  评论(0编辑  收藏  举报