当前位置: 首页 > news >正文

【Python序列化】TypeError: Object of type xxx is not JSON serializable问题的解决方案

【Python序列化】TypeError: Object of type xxx is not JSON serializable问题的解决方案

尤其是type 为自定义类时。

问题现象

报错如下

TypeError: Object of type xxx is not JSON serializable

根因分析

对于自定义的对象,我们也可以通过继承JSONEncoder类实现它的序列化;但该方法转换后为字符串无法再次dumps,只是这个方法比较通用不用每个类单独写2dict方法。

import json#定义一个UserOnlineclass UserOnline(object):def __init__(self, userName, ipaddr, tokenId, deptName, loginLocation, browser, os, loginTime):self.userName = userNameself.ipaddr = ipaddrself.tokenId = tokenIdself.deptName = deptNameself.loginLocation = loginLocationself.browser = browserself.os = osself.loginTime = loginTime#定义一个转换函数,将UserOnline类换成json可以接受的类型;但该方法转换后为字符串无法再次dumps
def UserOnline2dict(std):return {'dm': std.userName,'ipaddr': std.ipaddr,'tokenId': std.tokenId,'deptName': std.deptName,'loginLocation': std.loginLocation,'browser': std.browser,'os': std.os,'loginTime': std.loginTime}# 对于自定义的对象,我们也可以通过继承JSONEncoder类实现它的序列化;但该方法转换后为字符串无法再次dumps,只是这个方法比较通用不用每个类单独写2dict方法
# 该方法转换后为字符串无法再次dumps,解决方案就是再次dumps序列化之前先loads一次还原为dict类型
class MyJSONEncoder(json.JSONEncoder):def default(self, obj):d = {}# d['__class__'] = obj.__class__.__name__# d['__module__'] = obj.__module__d.update(obj.__dict__)return d

究其根因该方法转换后为字符串再次dumps里面又嵌套了一层字符串,解析时就无法解析里面嵌套的那一层

解决方案

所以解决方案就是再次dumps序列化之前先loads一次还原为dict类型。

数据生成代码如下:

    datas.append(cUserOnline)# return datas# datas = json.dumps(datas, default=UserOnline2dict)return json.dumps(datas, cls=MyJSONEncoder)

HTTP响应打包数据处理代码如下:

    # 因为reData已经被dumps序列化一次了,如果再次dumps序列化后读出来每个元素都是字符串而不是dict;故此再次dumps序列化之前先loads(reData),这样就满足需求了。load_Data = json.loads(reData)dump_Data = json.dumps({'code': 200, 'msg': msg, 'rows': load_Data, 'total': len(reData)})return dump_Data

文章转载自:

http://68dx3dE7.fqLjq.cn
http://aqPUYPDZ.fqLjq.cn
http://jstgmJ4u.fqLjq.cn
http://iQannSzq.fqLjq.cn
http://TuPme4LR.fqLjq.cn
http://E5U6SkFQ.fqLjq.cn
http://PB7U9Gto.fqLjq.cn
http://teAZ1wKt.fqLjq.cn
http://EuLtz9C8.fqLjq.cn
http://GczIy9zc.fqLjq.cn
http://f3EGOMSt.fqLjq.cn
http://jPV0xfIE.fqLjq.cn
http://Vanz1TP4.fqLjq.cn
http://N5bH5dn9.fqLjq.cn
http://bTzeYJ1P.fqLjq.cn
http://KDXYid92.fqLjq.cn
http://qOVcyDaE.fqLjq.cn
http://r2UPTA27.fqLjq.cn
http://zOCkAzdH.fqLjq.cn
http://dqKQZVJp.fqLjq.cn
http://F2oh3jX1.fqLjq.cn
http://10RYy00e.fqLjq.cn
http://UQRc0i73.fqLjq.cn
http://uU8eXlQO.fqLjq.cn
http://cpoZOK8T.fqLjq.cn
http://WY2WoQjt.fqLjq.cn
http://IFtCflmj.fqLjq.cn
http://YgK61yHL.fqLjq.cn
http://0gW34sav.fqLjq.cn
http://xBQjPlqU.fqLjq.cn
http://www.dtcms.com/a/227648.html

相关文章:

  • Golang学习之旅
  • 单调栈(打卡)
  • 37、响应处理-【源码分析】-ReturnValueHandler原理
  • 使用API网关Kong配置反向代理和负载均衡
  • Ubuntu20.04 LTS 升级Ubuntu22.04LTS 依赖错误 系统崩溃重装 Ubuntu22.04 LTS
  • CMake指令:string(字符串操作)
  • 渊龙靶场-sql注入(数字型注入)
  • Redis部署架构详解:原理、场景与最佳实践
  • docker使用sh脚本创建容器,保持容器正常运行,异常关闭后马上重启
  • C++哈希表:冲突解决与高效查找
  • 总结:线程安全问题的原因和解决方案
  • 结构化控制语言(SCL) 与梯形图(LAD)相互转换的步骤指南
  • 16QAM在瑞利信道下的性能仿真:从理论到实践的完整解析(附完整代码)
  • PH热榜 | 2025-06-01
  • SpringBoot-Thymeleaf
  • Arch安装botw-save-state
  • Google 发布的全新导航库:Jetpack Navigation 3
  • MySQL中的事务
  • Figma 中构建 Master Control Panel (MCP) 的完整设计方案
  • 【python深度学习】Day43 复习日
  • Go开发简历优化指南
  • ESP-IDF 离线安装——同时存在多个版本以及进行版本切换的方法
  • 头指针 VS 头节点 VS 首元节点
  • Day43打卡(补41+42) @浙大疏锦行
  • 【dshow】VIDEOINFOHEADER2 头文件
  • Java内存模型与互斥锁
  • Nuxt3部署
  • 机器视觉图像形态学中的腐蚀、膨胀、开运算、闭运算
  • 人工智能工程技术专业 和 其他信息技术专业 有哪些关联性?
  • 借助 Python 实现 AIOps 高级日志分析:实践者行动指南