python json.dumps()日期错误、输出中文为\uxxxx问题解决

1,218 阅读1分钟

在使用json.dumps时要注意一个问题

json.dumps(result, cls=json_helper.CJsonEncoder,ensure_ascii=False)

TypeError: Object of type 'datetime' is not JSON serializable 解决方法

解决日期错误,自定义日期检测:json_helper.py

#!/usr/bin/env python
# coding=utf-8

import json
import datetime

class CJsonEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime.datetime):
            return obj.strftime('%Y-%m-%d %H:%M:%S')
        elif isinstance(obj, datetime.date):
            return obj.strftime('%Y-%m-%d')
        else:
            return json.JSONEncoder.default(self, obj)

TypeError: Object of type 'bytes' is not JSON serializable

是因为json.dumps函数发现字典里面有bytes类型的数据,因此无法编码,只要在编码函数之前写一个编码类就行了,只要检查到了是bytes类型的数据就把它转化成str类型。因此可以自己写一个encoder去继承jsonencoder ,这样就能够进行编码了。

TypeError: Object of type 'ndarray' is not JSON serializable

这样也是一样的处理方式,当检查到了ndarray数据,把它转化成list数据就行

class MyEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime.datetime):
            return obj.strftime('%Y-%m-%d %H:%M:%S')
        elif isinstance(obj, datetime.date):
            return obj.strftime('%Y-%m-%d')
        elif isinstance(obj, np.ndarray):
            return obj.tolist()
        elif isinstance(obj, bytes):
            return str(obj, encoding='utf-8')
        else:
            return json.JSONEncoder.default(self, obj)

中文为\uxxxx问题

import json print json.dumps('中国') "\u4e2d\u56fd"

输出的会是 '中国' 中的ascii 字符码,而不是真正的中文。

这是因为json.dumps 序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False:

import json print json.dumps('中国') "\u4e2d\u56fd"

print json.dumps('中国',ensure_ascii=False) "中国"