【Python】|JSON序列化与反序列化
2016-08-18 15:10
323 查看
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 |
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教程。
相关文章推荐
- PyCon 2011 - Hidden Treasures of the Python Standard Library - json序列化操作
- Python JSON序列化
- python Json的一点收获,自定义序列化方法
- Python json序列化时default/object_hook指定函数处理
- Python3 序列化, json序列化
- python整理二十四——让simplejson支持datetime类型的序列化
- Python之数据序列化(json、pickle、shelve)
- python 序列化之JSON和pickle详解
- python 学习 -- json的序列化和反序列化
- Python Json序列化与反序列化
- python json 序列化反序列化 和 中文编码问题
- python序列化模块json和pickle
- [Python进阶-7]文件和目录的IO操作,以及json序列化和反序列化
- python 之序列化(pickle模块和json模块)
- Python序列化模型数据为JSON
- python Json的一点收获,自定义序列化方法
- python的序列化和反序列化以及json
- python序列化和json
- Python json.dumps 特殊数据类型的自定义序列化操作
- python json 序列化