解决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
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。