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)
网友评论