您的位置:首页 > 编程语言 > Python开发

【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.56int/float
true/falseTrue/False
nullNone
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教程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python json 序列化