JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。JSON的数据格式其实就是python里面的字典格式,里面可以包含方括号括起来的数组,也就是python里面的列表。
在python中,有专门处理json格式的模块—— json 和 picle模块
Json 模块提供了四个方法: dumps、dump、loads、load
pickle 模块也提供了四个功能:dumps、dump、loads、load
json的格式
对象
对象在python类似字典,表示为“{}”括起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值
{ "name": "laowang", "age": "18", "sex": "nan" }
数组
数组是中括号“[]”括起来的内容,在python中类似字典,数据结构为 ["value1","value2","value3",...],取值方式和所有语言中一样,使用索引获取
{ "name": "中国", "province": [ { "name": "黑龙江", "cities": { "city": [ "哈尔滨", "大庆" ] } }, { "name": "广东", "cities": { "city": [ "广州", "深圳", "珠海" ] } } ] }
json模块
首先要知道为什么要使用json。目前很有多的编程语言,关于数据,不同的语言有不用的存储方式,这就对不同编程语言之间的数据的交互带来了麻烦。json就是为了解决这个问题而出现。
dumps和dump
dumps和dump又称为是序列化方法
- dumps:只完成了序列化,序列化的时候是分为两步,首先将所有的双引号和单引号都规范为双引号,然后再转成一个字符串。
- dump:需要传入文件描述符,然后将序列化后的str保存到文件中
>>> import json >>> json.dumps([]) # dumps可以格式化所有的基本数据类型为字符串 '[]' >>> json.dumps(1) # 数字 '1' >>> json.dumps('1') # 字符串 '"1"' >>> dict = {"name":"Tom", "age":23} >>> json.dumps(dict) # 字典 '{"name": "Tom", "age": 23}'
a = {"name":"Tom", "age":23} with open("test.json", "w", encoding='utf-8') as f: # indent 超级好用,格式化保存字典,默认为None,小于0为零个空格 f.write(json.dumps(a, indent=4)) # json.dump(a,f,indent=4) # 和上面的效果一样,就是不用write了
loads和load
loads和load又称为反序列化方法
- loads:只完成了反序列化,也就是将字符中的原有数据提取出来,反序列化的时候要注意要反序列化的数据格式必须满足json的规范要求。
- load:只接收文件描述符,就完成了读取文件和反序列化
个人推荐最好不要用eval(),因为如果可以运算的字符串,结果就会和应该的到的不一致,比如字符串里有含有"
1+2
",本来就是个字符串,但是结果是以"3
"的方式输出的。>>> json.loads('{"name":"Tom", "age":23}') {'age': 23, 'name': 'Tom'}
import json with open("test.json", "r", encoding='utf-8') as f: aa = json.loads(f.read()) f.seek(0) bb = json.load(f) # 与 json.loads(f.read()),相当于是没有了read的操作 print(aa) print(bb) # 输出: {'name': 'Tom', 'age': 23} {'name': 'Tom', 'age': 23}
pickle模块
json模块和pickle模块都有 dumps、dump、loads、load四种方法,而且用法一样。
不用的是json模块序列化出来的是通用格式,其它编程语言都认识,就是普通的字符串,
而picle模块序列化出来的只有python可以认识,其他编程语言不认识的,表现为乱码
不过picle可以序列化函数,但是其他文件想用该函数,在该文件中需要有该文件的定义(定义和参数必须相同,内容可以不同)
相较于json来说,序列化和反序列化的速度要更快一些。
因为使用和json模块基本一致,就是换个模块名,只要知道区别就行了,简单放个例子,就不多说了
>>> import pickle >>> d = {'1': {'count': 10, 'selected': True}, '2': {'count': 20, 'selected': False}} >>> s = pickle.dumps(d) >>> s b'x80x03}qx00(Xx01x00x00x001qx01}qx02(Xx05x00x00x00countqx03K Xx08x00x00x00selectedqx04x88uXx01x00x00x002qx05}qx06(hx03Kx14hx04x89uu.' >>> pickle.loads(s) {'1': {'count': 10, 'selected': True}, '2': {'count': 20, 'selected': False}}