当前位置: 首页 > 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://www.lqws.cn/news/73729.html

相关文章:

  • Java引用类型
  • BayesFlow:基于神经网络的摊销贝叶斯推断框架
  • rabbitmq Topic交换机简介
  • 「Python教案」字符串格式化操作
  • 微服务-Sentinel
  • Windows环境下Scoop包管理工具的全面指南
  • 60、Polly瞬态故障处理
  • uni-id-pages login-by-google实现
  • 网络安全:网页密码防护与记住密码功能的安全
  • ubuntu24.04 查看时区并设置Asia/Shanghai时区
  • 基于GPT-SoVITS-v4-TTS的音频文本推理,流式生成
  • 设计模式——中介者设计模式(行为型)
  • MDP的curriculums部分
  • LeetCode 高频 SQL 50 题(基础版) 之 【高级查询和连接】· 上
  • 【C语言】C语言经典小游戏:贪吃蛇(上)
  • StarRocks的几种表模型
  • 在 Windows安装 make 的几种方式
  • 结构型设计模式之桥接模式
  • Python基础:人生重开模拟器(小游戏)
  • 二叉查找树 —— 最近公共祖先问题解析(Leetcode 235)
  • SCAU8642--快速排序
  • 计算机视觉---深度学习框架(Backbone、Neck、Head)
  • 每日算法-250602
  • Windows+VSCode搭建小智(xiaozhi)开发环境
  • 开源的JT1078转GB28181服务器
  • PDF 转 HTML5 —— HTML5 填充图形不支持 Even-Odd 奇偶规则?(第一部分)
  • 【Spring】RAG 知识库基础
  • Axure 基础入门
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Form Wave(表单label波动效果)
  • 自主设计一个DDS信号发生器