Discuss / Python / 序列化

序列化

Topic source

Mr_RightMen

#1 Created at ... [Delete] [Delete and Lock User]
# json模块,用于实现python数据类型与通用json字符串之间的转换
# dumps 将python数据类型转换成对应的json格式
data = {"key1":"value1"}

d1 = json.dumps(data)
print(d1)
print(type(d1))

# loads 将json数据转换成对应的python数据类型
data = '{"key1":"value1"}'

l1 = json.loads(data)
print(l1)
print(type(l1))
# dump将数据转换成对应的json格式,并写入文件,load加载json文件,并转换成对应的python数据类型

import json
# 如果python数据是dict,则序列化成{"key1": "value1"}
# 如果python数据是str, 则序列化成"{\"key1\":\"value1\"}"

# data = {"key1":"value1"}
data = '{"key1":"value1"}'
with open('test.txt','w') as f:
    json.dump(data,f)

# 反序列化
with open('test.txt','r') as f:
    print(json.load(f))




# pickle模块,用于将实现python数据类型的序列化和反序列化

# dumps 将python数据序列化成bytes
d=dict(name='Bob', age=20, score=88)
print(pickle.dumps(d))

# loads 将bytes数据转换成对应的python数据
d=dict(name='Bob', age=20, score=88)
b1=pickle.dumps(d)
print(pickle.loads(b1))

# dump将对象序列化后,写入一个file-like object
with open('test.txt','wb') as f:
    pickle.dump('testaaaa',f)

# load 将file-like object中的数据反序列化,转换成python对应的数据
with open('test.txt','rb') as f:
    print(pickle.load(f))


# 自定义对象的json序列化

class Student(object):
    def __init__(self,name,age,score):
        self.name = name
        self.age = age
        self.score = score

s = Student('Bob',20,88)

# 如果直接json.dumps(s),会报错
# TypeError: Object of type 'Student' is not JSON serializable
# 查看dumps的参数得知,默认情况下dumps通过default参数将对象变成一个可进行序列化的对象
# 大意就是我指定default的方法是什么,然后对s这个对象用指定的方法进行操作,变成可被序列化
# 所以,我们来写一个转换的方法

def student2dict(std):
    return {
      'name': std.name,
      'age': std.age,
      'score': std.score
    }

print(json.dumps(s,default=student2dict))

# 还有另外一种方式,我们知道json.dumps是可以对dict进行序列化的,那么我们可以将实例都变成一个dict,就可以被json序列化了

print(json.dumps(s,default=lambda obj:obj.__dict__))

# 如果我们要把一个json反序列化成一个实例,首先loads会转换出一个dict对象,然后,我们传入objcet_hook函数,将dict转换成实例
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))

# ensure_ascii=True,保证所有传入的非ASCII的字符都被转义,如果为false,则保持原样输出

  • 1

Reply