• 【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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    总结

    1. 自定义对象转Json时需要自定义转换方法default,通常是将对象转为dict类型
      1. 可自定义dict数据内容
      2. 也可通过object.__dict__获取对象属性
    2. Json数据转换对象时需要自定义转换方法object_hook
      1. object_pairs_hook是有序数据方法,优先于object_hook
      2. 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__)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    Ubuntu 22.04 搭建 KubeSphere 3.4.1 集群
    HarmonyOS CPU与I/O密集型任务开发指导
    Python3数据科学包系列(二):数据分析实战
    J2EE进阶(九)org
    Redis 主从架构数据同步
    用c语言实现一个简单的链表二叉树
    java计算机毕业设计牙科诊所信息化管理平台源码+系统+数据库+lw文档
    怎么文字转语音真人发声?安利下面这三款软件
    JS DataTable中导出PDF中文乱码
    基于SSM的个人相册管理系统
  • 原文地址:https://blog.csdn.net/Sheldon74/article/details/132729032