美文网首页工作生活
Python对象序列化

Python对象序列化

作者: 拖延症旳理想主义者 | 来源:发表于2019-07-04 19:47 被阅读0次

1、对象和类的dict属性:

import json
# 类的__dict__属性,会打印当前类所有的方法和类属性,但不会打印__init__()中的实例属性
class_json = json.dumps(User.__dict__)

# 类实例的__dict__属性,只会打印__init__()中的实例属性
obj_json = json.dumps(user.__dict__)

# 以上都不全,而且不能控制需要实例化的字段

2、使用json函数的default参数:

# json函数支持default参数传入一个函数,对需要序列化的类进行中间处理,返回一个支持序列化的对象
class User:

    name = "lzh"
    age = 23

    @staticmethod
    def set_json(obj):
        # 这里可以控制需要序列化的字段
        return {
            "name": obj.name,
            "age": obj.age
        }

if __name__ == '__main__':
    # user对象作为default传入的函数set_json的参数
    print(json.dumps(user, default=user.set_json))

3、使用dict()方法,将对象转成字典对象,再交给json模块序列化:

# 默认执行dict(user),python会抛出异常:
TypeError: 'user' object is not iterable

# User类必先实现keys和__getitem__()两个方法:
class User:

    name = "lzh"
    age = 23

    @staticmethod
    def keys():
        """
        静态方法,dict(obj)执行时,会先调用这个方法
        :return: 序列化后需要显示的key的列表
        """
        return ["name", "age"]

    def __getitem__(self, item):
        """
        实现__getitem__,称之为可迭代对象
        :param item: key值
        :return: 根据返回逻辑返回值
        """
        return getattr(self, item)

# 再去执行dict(user),就会按照keys()返回的key列表,去获取属性值,生成一个字典
print(dict(user))

4、继承json.JSONEncoder,自定义序列类:

class JsonOwn(JSONEncoder):

    def default(self, o):
        """
        重写default方法
        """
        return dict(o)

相关文章

网友评论

    本文标题:Python对象序列化

    本文链接:https://www.haomeiwen.com/subject/kpkdhctx.html