大家好!前两天学习了序列化,学到了使用Pickle序列化和反序列化,但是Pickle有一个缺陷就是不同的语言不通用,而且不同版本的python解释器也会发生一些错误,只能用于某一个版本,所有使用性不大。
如果我们需要在不同的编程语言之间传递对象,那么我们必须把对象序列化成标准化格式,比如xml,但是更好的方法是json,因为json表现出来就是一个字符串,可以被所有的语言读取,也方便存储到磁盘或者网络传输,json不仅是标准模式,并且速度也比xml更快,还可以在web中读取,非常方便,所以大都会选择Json。
下表为Json在Python和在其他语言中的类型表:
json可以直接序列化python基本数据类型。
把数据序列化为Json字符串
方法1.json.dumps(obj,default)
注意:若obj为python基本数据类型,我们无需写default,直接进行序列化
若obj为自定义的数据类型,这时候default后面跟的是将对象转为基本数据类型的函数
功能:将obj使用default函数转为字典并且序列化为json字符串,并且返回
方法2.json.dump(obj,f,default)
功能:将obj使用default函数转为python基本数据类型并且序列化为json字符串,
并且写入到指定的打开的f中。
把Json字符串转化为指定类型
json.loads(jsonstr,object_hook)
功能:将jsonstr转为指定类型,通过object_hook的方法将指定类型转为对象
json.load(f,object_hook)
功能:读取打开文件的内容,并且将读取的内容转为python基本数据类型
通过object_hook的方法将python基本数据类型转为对象。
下面看一个例子:
#/usr/bin/env python
#-*- coding: utf-8 -*-
#-*- author: zhaojinmeng -*-
import json
class Person(): #声明一个类,两个属性
def __init__(self,name,age):
self.name = name
self.age = age
def per2dict(per):
return {"name":per.name,"age":per.age} # 先把需要写入的数据转为python基本数据模式
def dict2per(pe):
return Person(pe["name"],pe["age"]) #将字典转为对象的函数
if __name__ == '__main__':
pers = Person("101110", 110) #实例化
with open("Personss.txt","w",encoding="utf-8") as f: #打开文件,把数据写入到指定的文件内
str1 = json.dumps(pers, default=per2dict) # 1.把需要写入的数据转为json字符串,转化的类型(per2dict)放入dumps里
f.write(str1) #2.写入指定的文件里
'''
转为json字符串写入,方法1
str1 = json.dumps(pers, default=per2dict)
f.write(str1)
注意:把数字转为字典的方法需要自己定义,例如我定义的per2dict
转为json字符串写入,方法2
json.dump(pers,f,default=per2dict)
'''
# json.dump(pers,f,default=per2dict) # json.dump直接把需要转化的数据(pers),需要写入的文件(f),转化的类型(per2dict)放入dump里。
with open("Personss.txt","r",encoding="utf-8") as f2: #读取指定的Json字符串数据
srtdic = json.load(f2,object_hook=dict2per) #使用json.load,f2为打开的文件
print(srtdic) #输出的是一个Person对象
运行结果: