当前位置: 首页 > 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

相关文章:

  • 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 复习日
  • 做英文网站价格/怎么建立个人网站
  • 温州网站建设 seo/冯耀宗seo视频教程
  • 网站第一步建立/今天高清视频免费播放
  • 随州网站建设学校/百度seo排名优化助手
  • 在线下单网站怎么做/官网seo关键词排名系统
  • 合肥网站建设网页设计/网络推广app是违法的吗