【Python】关于自定义对象的Json序列化和反序列化
背景
最近使用Ptyon爬虫数据时,遇到对象无法转换为JSON序列化对象问题TypeError: Object of type Main is not JSON serializable
意思: 就是对象不能转换为JSON序列化对象
原因: 是对象没有自定义实现转换为JSON序列化对象的方法没有。
实现
class Main(object):
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return 'Main(name={}, age={})'.format(self.name, self.age)
def __repr__(self):
return 'Main(name={}, age={})'.format(self.name, self.age)
def to_json(self):
return {'name': self.name, 'age': self.age}
@classmethod
def from_json(cls, json_data):
return cls(**json_data)
if __name__ == '__main__':
main = Main('zhangsan', 18)
# 因为Main是自定义对象,如果没有指定default方法,则无法转换为JSON序列化对象,并且报错`TypeError: Object of type StockData is not JSON serializable`
# jsonStr = json.dumps(main)
jsonStr = json.dumps(main, default=lambda obj: obj.__dict__)
print(jsonStr)
json.loads(jsonStr, object_hook=Main.from_json)
总结
- 自定义对象转Json时需要自定义转换方法
default
,通常是将对象转为dict
类型- 可自定义
dict
数据内容 - 也可通过
object.__dict__
获取对象属性
- 可自定义
- Json数据转换对象时需要自定义转换方法
object_hook
object_pairs_hook
是有序数据方法,优先于object_hook
object_hook
是无序数据方法
# 将json数据转换为对象
def json_2_obj(data):
return Main(data['name'],data['age'])
data = json.loads(jsonStr,object_hook=json_2_obj)
# 将对象数据转换为json字符串
def obj_2_json(obj):
"""
# 自定义类转json需要自定义一个转换成python基本类型的方法
def obj_2_json(obj):
return {
"name":obj.name
}
"""
return json.dumps(obj,default=lambda obj:obj.__dict__)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?