python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > TypeError: Object of type xxx is not JSON serializable

解决TypeError: Object of type xxx is not JSON serializable错误问题

作者:zaf赵

这篇文章主要介绍了解决TypeError: Object of type xxx is not JSON serializable错误问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

TypeError: Object of type xxx is not JSON serializable

问题描述

在导入Python json包,调用json.dump/dumps函数时,可能会遇到TypeError: Object of type xxx is not JSON serializable错误,也就是无法序列化某些对象格式。

解决办法

默认的编码函数很多数据类型都不能编码,自定义序列化,因此可以自己写一个Myencoder去继承json.JSONEncoder

具体如下:

class MyEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, np.integer):
            return int(obj)
        elif isinstance(obj, np.floating):
            return float(obj)
        elif isinstance(obj, np.ndarray):
            return obj.tolist()
        else:
            return super(MyEncoder, self).default(obj)

然后在调用json.dump/dumps时,指定使用自定义序列化方法

json.dumps(data, cls=MyEncoder) 

dict to json

def dict_to_json(dict_obj,name, Mycls = None):
    js_obj = json.dumps(dict_obj, cls = Mycls, indent=4)
    with open(name, 'w') as file_obj:
        file_obj.write(js_obj)

json to dict

def json_to_dict(filepath, Mycls = None):
    with open(filepath,'r') as js_obj:
        dict_obj = json.load(js_obj, cls = Mycls)
    return dict_obj

TypeError: Object of type ‘int64’ is not JSON serializable (或者float32)

在使用json格式保存数据时,经常会遇到xxx is not JSON serializable,也就是无法序列化某些对象格式,我所遇见的是我使用了numpy时,使用了np的数据格式,写入data后,json.dumps(data)失败,我们可以自己定定义对特定类型的对象的序列化

下面看下怎么定义和使用关于np数据类型的自定义。

1.首先,继承json.JSONEncoder,自定义序列化方法。

class NpEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, np.integer):
return int(obj)
elif isinstance(obj, np.floating):
return float(obj)
elif isinstance(obj, np.ndarray):
return obj.tolist()
else:
return super(NpEncoder, self).default(obj)

2.使用dumps方法(我们可以直接把dict直接序列化为json对象)加上 cls=NpEncoder,data就可以正常序列化了

json.dumps(data, cls=NpEncoder)

其实,很简单,自定义一个序列化方法,然后dumps的时候加上cls=NpEncoder

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文