• 【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
  • 相关阅读:
    图像处理之LSB替换隐写算法的实现
    Scrapy爬虫框架入门(豆瓣电影Top 250)
    k8s怎么配置secret呢?
    Springboot启动之后立即执行某些方法可以怎么做?Springboot生命周期,Springboot生命周期钩子函数总结大全
    linux 关闭不了docker服务
    串口调速小车1
    直播预告 | 敏捷教练送外卖无限游戏
    程序验证之Dafny--证明霍尔逻辑的半自动化利器
    深入了解移动端适配的方案
    JavaWeb JSTL标签库
  • 原文地址:https://blog.csdn.net/Sheldon74/article/details/132729032