【Python】|JSON序列化与反序列化
来源:互联网 发布:城市智能交通大数据 编辑:程序博客网 时间:2024/03/28 17:46
Python
廖雪峰Python教程学习笔记
在程序的运行过程中,所有的变量都是在内存中,变量在内存中来得快也去得快,所以我们需要将内存中的变量转化为可存储的对象或者可传输的对象,这样的过程就叫做序列化。
Python中提供了pickle
模块来实现对象的序列化与反序列化,pickle.dumps()
将任意的对象序列化成一个bytes。pickle.loads()
实现反序列化,得到对象。
JSON:
JSON可以理解为序列化的标准格式。JSON和Python内置的数据类型对应如下:
Python内置的json
模块提供了完备的Python对象到JSON格式的转换。将Python对象变为一个JSON:
"""利用json模块序列化与反序列化"""import jsondi = 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 jsonclass Student(object): def __init__(self, name, age, score): self.name = name self.age = age self.score = scores = 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 jsonclass 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教程。
- 【Python】|JSON序列化与反序列化
- Python Json序列化与反序列化
- Json序列化 与反序列化
- JSON序列化与反序列化
- JSON序列化与反序列化
- Json序列化与反序列化
- Json序列化与反序列化
- JSON序列化与反序列化
- JSON序列化与反序列化
- JSON序列化与反序列化
- JSON序列化 与反序列化
- JSON序列化与反序列化
- JSON序列化与反序列化
- JSON序列化与反序列
- python 序列化与反序列化
- 序列化与反序列化,及Json序列化反序列化
- Python 序列化 与 反序列化 JSON 与 pickle 模块
- python 学习 -- json的序列化和反序列化
- 数值分析:矩阵求逆-奇异性、条件数
- 关于ARM的统一编制与内存映射机制
- ListView和Adapter Crash问题的分析和解决
- 微软面试百题005——SBT再解第K数问题
- 通过socket登陆MySQL
- 【Python】|JSON序列化与反序列化
- jquery change()时间
- 数据结构与算法题目集(中文)4-10 二分查找 (20分)
- android中的mvp模式(二)
- c++ 函数模板 类模板
- (*(volatile unsigned long *) 地址)
- Canvas裁剪和Region、RegionIterator
- Quartz+Spring 分布式定时任务调度(一)- 环境搭建
- 图形视图框架(The QGraphics View Framework)