# 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,则保持原样输出
Sign in to make a reply
Mr_RightMen