【Python】|JSON序列化与反序列化
Python
廖雪峰Python教程学习笔记
在程序的运行过程中,所有的变量都是在内存中,变量在内存中来得快也去得快,所以我们需要将内存中的变量转化为可存储的对象或者可传输的对象,这样的过程就叫做序列化。
Python中提供了pickle模块来实现对象的序列化与反序列化,pickle.dumps()将任意的对象序列化成一个bytes。pickle.loads()实现反序列化,得到对象。
JSON:
JSON可以理解为序列化的标准格式。JSON和Python内置的数据类型对应如下:
| JSON类型 | Python类型 |
|---|---|
| {} | dict |
| [] | list |
| “string” | str |
| 1234.56 | int/float |
| true/false | True/False |
| null | None |
Python内置的json模块提供了完备的Python对象到JSON格式的转换。将Python对象变为一个JSON:
"""
利用json模块序列化与反序列化
"""
import json
di = dict(name='BOb', age=20, score=93)
>>> json.dumps(di)
'{"name": "BOb", "age": 20, "score": 93}'
同理,将JSON反序列化为Python对象:
json_str = '{"name": "BOb", "age": 20, "score": 93}'
>>> json.loads(json_str)
{'score': 93, 'name': 'BOb', 'age': 20}
在class对象中使用JSON:
通常情况下,我们都习惯使用class表示对象,若我们需要将Student类进行序列化 ,我们可以做如下尝试:
import json
class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
s = Student('WeiYu', 23, 98)
print(json.dumps(s))
看似很合理,但是会得到一个错误:
Traceback(most recent call last):
...
TypeError: <__main__.Student object at 0x0000023A4C643128> is not JSON serializable
原因是Student这个对象并不能序列化为JSON。
但是dumps()方法的参数列表中还有很多可选参数,这些款参数就是提供给我们来定制JSON序列化的。
其中default参数就是把任意一个对象编程一个可序列的JSON的对象,但是在这之前需要为Student写一个转换函数,然后再将函数传进去:
import json
class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
# 编写一个转换函数如下:
def student2dict(std):
return {
'name': std.name,
'age': std.age,
'score': std.score
}
s = Student('WeiYu', 23, 98)
print(json.dumps(s, default=student2dict)) # 将转换函数传入参数default
>>> # 输出结果
{"score": 98, "age": 23, "name": "WeiYu"}
这样Student实例先被student2dict转换成dict,然后被序列化为JSON,但是如果下一次遇到另外一个实例Teacher,又需要编写一个转换函数,这样可能就太麻烦了。
我们可以利用__dict__属性,将任意class实例变为dict:
>>>print(json.dumps(s, default=lambda obj: obj.__dict__))
>>>
{"name": "WeiYu", "age": 23, "score": 98}
得到同样的结果,因为通常的class的实例都有一个–dict–(前后是两个下滑线)属性,它自身就是一个dict,用来存储实例变量。
同理,需要反序列化JSON时,loads()方法先转换出一个dict对象,然后通过传入的object_hook函数将dict转换为Student实例,查看loads()参数列表。定义转换函数:
def dict2student(d):
return Student(d['name'], d['age'], d['score'])
# 测试输出
>>> json_str = '{"age": 20, "score": 88, "name": "Bob"}'
>>> print(json.loads(json_str, object_hook=dict2student))
<__main__.Student object at 0x000001F7FDE1E940>
这样就实现了JSON序列化与反序列化。另,强推廖雪峰老师的Python教程。
新一代开源开发者平台 GitCode,通过集成代码托管服务、代码仓库以及可信赖的开源组件库,让开发者可以在云端进行代码托管和开发。旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。
更多推荐


所有评论(0)