今天学习到了python的序列化和反序列化,于是就试着写了一个例子,淡然我这里写的不是简单的把衣蛾dict转换成json字符串和json字符串反序列化成dict,我自己用了点时间写成功了class转json和json反序列化成class的一个demo,在这里记录一下并且和大家分享一下。
1. 第一步先建一个用于序列化的class,名字我取了叫Building.py
class Building(object):
def __init__(self, name, unit, floors):
self.name = name
self.unit = unit
self.floors = floors
这个类没什么特殊的,就定义了三个字段,第1个字段就是一个字符串,第2个字段其实是我定义的另外一个class,我是为了测试class嵌套的序列化效果,第3个字段是一个字符串数组,下面我把Unit.py贴出来
class Unit(object):
def __init__(self, name):
self.name = name
在Unit里就定义了一个字符串字段。
2. 第二步就是序列化的过程了
首先顶一个Building的实例
building = Building('来福士', Unit('number one'), ['1', '2', '3'])
下面去序列化这个building成json字符串
building_json = json.dumps(building, default=lambda obj: obj.__dict__)
print('Dump Student:', building_json)
这个代码执行结果如下:
Dump Student: {"name": "\u6765\u798f\u58eb", "unit": {"name": "number one"}, "floors": ["1", "2", "3"]}
通过结果看出来,最终成功将类序列化成json字符串,并且每个字段都包含在内。但往往序列化和反序列化是并存的,因为我们实际应用过程中是需要这样做,下面我们来说反序列化的过程。
3. 反序列化
building_obj = json.loads(building_json, object_hook=lambda d: namedtuple('X', d.keys())(*d.values()))
print(building_obj.unit.name)
ok,这样直接又将上边序列化的json String 反序列化成我们定义的Building class了,例子中只打印了unit里的name,这足以表明我们反序列化成功了。
通过实验ensure_ascii这个参数发现这个是设置是否要将字符转换成ascii