Python教程:json序列化的方法(json的序列化和反序列化)

网友投稿 1021 2022-09-01


Python教程:json序列化的方法(json的序列化和反序列化)

Python内置的json模块提供了非常完善的对象到JSON格式的转换。废话不多说,我们先看看如何把Python对象变成一个JSON:

d = dict(name='Kaven', age=17, sex='Male')print(json.dumps(d)) # {"name": "Kaven", "age": 17, "sex": "Male"}

说明:

dumps()方法返回一个str,内容就是标准的JSON。类似的,dump()方法可以直接把JSON写入一个 Object。

要把JSON反序列化为Python对象,我们可以用loads()或者对应的load()方法,前者把JSON的字符串反序列化,后者从Object中读取字符串并反序列化:

比如这样:

import jsonjson_str = '{"name": "Kaven", "age": 17, "sex": "Male"}'print(json.loads(json_str)) # {'name': 'Kaven', 'age': 17, 'sex': 'Male'}

Python的dict对象可以直接序列化为JSON的{},那么如何用class对象,比如定义Person类,然后序列化?

dumps 可选参数default就是把任意一个对象变成一个可序列为JSON的对象,我们只需要为Person专门写一个转换函数,再把函数传进去即可:

'''学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!'''import jsonclass Person(object): # __slots__ = ('name', 'age') # 通常class的实例都有一个__dict__属性,它就是一个dict, # 用来存储实例变量。也有少数例外,比如定义了__slots__的class,大家可以开启后运行看看报错信息 def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sexdef PersonToDict(cls): return { 'name': cls.name, 'age': cls.age, 'sex': cls.sex }s = Person('Kaven', 17, 'Male')print(json.dumps(s, default=PersonToDict))# print(json.dumps(s, default=lambda obj: obj.__dict__)) 输出和上面一样# 输出 : {"name": "Kaven", "age": 17, "sex": "Male"}

这样,Person实例首先被PersonToDict()函数转换成dict,然后再被序列化为JSON,大家看到下面有个lambda匿名函数,他的用处可大了,比如:

下次如果遇到一个Apple/Banaba等类的实例,可以把任意class的实例变为dict:

print(json.dumps(s, default=lambda obj: obj.__dict__)) # obj为对象参数名,可自定义

同样的道理,如果我们要把JSON反序列化为一个Person对象实例,loads()方法首先转换出一个dict对象,然后,我们再传入的object_hook函数负责把dict转换为Person实例:

import jsonclass Person(object): # __slots__ = ('name', 'age') # 通常class的实例都有一个__dict__属性,它就是一个dict, # 用来存储实例变量。也有少数例外,比如定义了__slots__的class,大家可以开启后运行看看报错信息 def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sexdef DictToPerson(d): return Person(d['name'], d['age'], d['sex'])json_str = '{"name": "Kaven", "age": 20, "sex": "Male"}'cls = json.loads(json_str, object_hook=DictToPerson)print(cls.name) # Kaven

Python还有个pickle模块,可能存在Python兼容问题,只能用Pickle保存那些不重要的数据。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:一篇文章带你初步认识Maven
下一篇:Python学习笔记之Python的多重继承和MixIn(python)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~