解决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
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Python成功解决ZeroDivisionError: division by zero的方法过程
在Python编程中,ZeroDivisionError:divisionbyzero是因为尝试除以零所导致的常见错误,这篇文章详细介绍了错误的原因、解决方案,需要的朋友可以参考下2024-09-09
Python光学仿真从Maxwell方程组到波动方程矢量算法理解学习
这篇文章主要为大家介绍了Python光学仿真从Maxwell方程组到波动方程算法的理解学习,有需要的朋友可以借鉴参考下,希望能够有所帮助2021-10-10
django框架实现模板中获取request 的各种信息示例
这篇文章主要介绍了django框架实现模板中获取request 的各种信息,结合实例形式分析了Django框架模板直接获取request信息的相关配置与操作技巧,需要的朋友可以参考下2019-07-07
Python OpenCV超详细讲解读取图像视频和网络摄像头
OpenCV用C++语言编写,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令,本篇文章带你了解OpenCV读取图像视频与网络摄像头的方法2022-04-04


最新评论