json:全称JavaScript Object Notation,是一种java脚本兑现标记语言,已经成为一种简单的数据交换格式,通常用于序列化和反序列化工作。
一、json的dumps方法与loads方法
作用:主要操作内存中的数据
1.json.dumps(数据):将数据转换成json字符串
2.json.loads(json字符串):将json字符串转换为原来的数据
二、json的dump方法与load方法
作用:常组合使用于文件操作中
打开某一文件后-->1.json.dump(数据, 文件) 将数据先转换成json字符串再写入文件
2.json.load(文件) 将文件中的json字符串读取出来并转换为原来的数据
缺点:json操作文件通常是一次性写,一次性读。即在你打开某一文件到文件关闭之前,你只能写入一次或者读取一次
三、序列化:serialization
将内存中的数据,转换成字节串 ,用以保存在文件或通过网络传输
import json # json.dumps() 把指定的对象转换成json格式的字符串并返回 s = json.dumps([1, 2, 3]) print(s, type(s)) # '[1, 2, 3]' s1 = json.dumps((1, 2, 3)) # 元组序列化后,其形式会变成列表 print(s1, type(s1)) s2 = json.dumps(10) print(s2, type(s2)) s3 = json.dumps({'name':'David', 'age':20}) print(s3, type(s3)) # 可以将某一数据对象写到文件中 # with open('b.txt', encoding='utf-8', mode='a') as f: # json.dump([1, 2, 3, 4], f)
四、反序列化:deserialization
从文件、网络中获取的数据,替换为内存中原来的数据类型
import json res = json.dumps(100) # 把100变为json字符串 num = json.loads(res) # 原来数据类型 print(num, type(num)) # 从文件中反序列化 with open('b.txt', encoding='utf-8') as f: res = json.load(f) print(type(res)) print(res)
五、如何解决dump方法与load方法在文件操作中的缺点
思路:把需要序列化的数据对象,通过多次序列化的方式(可以理解为将对象拆分成多个小块),再用文件操作的write方法,将多次序列化之后的json字符串依次全部写入文件
1.多次序列化后写入文件
with open('json.txt', encoding='utf-8', mode='a') as f: f.write(json.dumps([1, 2]) + '\n') f.write(json.dumps([3 ,4, 5]) + '\n')
2.把分次序列化的json字符串,从文件中反序列化回来
with open('json.txt', encoding='utf-8', mode='rt') as f: for line in f: print(json.loads(line.strip()))
六、补充一些小知识点
l1 = [i for i in range(5)] # l1 --> bytes # b1 = l1.encode('utf-8') # 不能直接转换 # 只有字符串才能和bytes相互转换 # 先转换成字符串再转换成bytes b1 = str(l1).encode('utf-8') print(b1, type(b1)) # 假如接收方接收到了 b1 # 需要先以相应的编码格式对b1进行解码 s2 = b1.decode('utf-8') print(s2, type(s2)) dic = {'name':'lgq', 'age':22, 'stats':True} import json # 将dic转换成特殊的字符串 s3 = json.dumps(dic, ensure_ascii=False) print(s3, type(s3)) # 再转换回去 dic1 = json.loads(s3) print(dic1, type(dic1))
七、小结
json主要用于序列化和反序列化
缺点:不安全;不适用于set数据类型