python序列化
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
Python中使用json
导入json包
import json
json包有四个方法
-
-
json.loads():将已编码的 JSON 字符串解码为 Python 对象
-
json.dump():将Python内置类型序列化为json对象后写入文件
-
json.load():读取文件中json形式的字符串元素转化为Python类型
dumps()跟loads()都是直接将python对象跟JSON字符串相互转换的方法,结果可以用一个变量接收,而dump()跟load()会把结果放到文件或者从文件中读取结果,因此需要传一个文件句柄
例如:
import json data = { 'nanbei':'haha', 'a':[1,2,3,4], 'b':(1,2,3) } with open('json_test.txt','w+') as f: json.dump(data,f) print(json.load(f))
将Python类对象序列化
如下:
import json class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender p = Person("Tom", "female") str_p = json.dumps(p) # Object of type 'Person' is not JSON serializable print(str_p)
那么应该怎样解决这个问题呢?
其实在dumps()方法中有许多默认的参数,不妨从中找到解决办法
在dumps()中有一个default参数,我们可以传一个函数给它,这个函数的作用就是用来定制要被序列化的对象的序列化规则的
import json class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender # 定义将对象转换为json的函数 def obj2json(obj): return { "name": obj.name, "gender": obj.gender } p = Person("Tom", "female") str_p = json.dumps(p, default=obj2json) print(str_p)
import json class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender p = Person("Tom", "female") str_p = json.dumps(p, default=lambda obj: obj.__dict__, sort_keys=True, indent=4) print(str_p)
indent=4 会按照键值对以间隔4来直观的显示
在类里面定制规则
除了在方法里面定制规则以外,还可以写一个类,继承JSONEncoder,重写default()方法,在那里面制定序列化规则
import json from json.encoder import JSONEncoder class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender class JsonEncoder(JSONEncoder): def default(self, o): return o.__dict__ # 定制序列化规则 p = Person("Jack", "male") print(json.dumps(p, cls=JsonEncoder))

浙公网安备 33010602011771号