JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,Python3 中可以使用 json 模块来对 JSON 数据进行编解码,主要包含4个操作函数:
image.png
提示:所谓类文件对象指那些具有read()或者 write()方法的对象,例如,f = open(‘a.txt’,’r’),其中的f有read()方法,所以f就是类文件对象
在json的编解码过程中,python 的原始类型与JSON类型会相互转换,具体的转化对照如下:
Python 编码为 JSON 类型转换对应表:

Python JSON
dict object
list, tuple array
str string
int, float, int- & float-derived Enums number
True true
False false
None null

JSON 解码为 Python 类型转换对应表:

JSON Python
object dict
array list
string str
number (int) int
number (real) float
true True
false False
null None

json.dump(obj,fp):将python数据类型转换并保存到json格式的文件内
json.dumps(obj):将python数据类型转换成json字符串
json.load(fp):将json格式的文件中读取数据并转换成python的数据类型
json.loads(s):将json格式的字符串转换成python的类型

操作提示:

(一)Python类型转换成JSON数据类型

  1. import json
  2. d = {
  3. "code": 0,
  4. "msg": "操作成功",
  5. "token":"sdgdgsdgsds"
  6. }
  7. ret = json.dumps(d,ensure_ascii=False) #输出结果中有中文,需要指定ensure_ascii=False
  8. print(ret)
  9. print(type(ret))

输出结果如下:
image.png

(二)JSON数据类型换成Python类型

  1. import json
  2. s="""
  3. {
  4. "code": 0,
  5. "msg": "操作成功",
  6. "token":"sdgdgsdgsds"
  7. }
  8. """
  9. ret = json.loads(s) #json转字典的
  10. print(ret)
  11. print(type(ret))

输出结果如下:
image.png

2.1.json.dump()用于将dict类型的数据转成str,并写入到json文件中

  1. # 方法一
  2. with open("student2.json",'w',encoding="utf-8") as f:
  3. json_str = json.dumps(d,ensure_ascii=False,indent=4)
  4. f.write(json_str)
  5. # 方法二
  6. with open("student2.json",'w',encoding="utf-8") as f:
  7. json.dump(d,f,ensure_ascii=False,indent=4)

输出结果如下:
image.png

2.2 json.load()用于从json文件中读取数据

  1. # 方法一
  2. with open("student.txt",encoding="utf-8") as f:
  3. dic = json.loads(f.read())
  4. print(dic)
  5. # 方法二
  6. with open("student.txt",encoding="utf-8") as f:
  7. dic = json.load(f)
  8. print(dic)

输出结果如下:
image.png

(三) jsonpath

用来解析多层嵌套的json数据;JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本

  1. import jsonpath
  2. res=jsonpath.jsonpath(dic_name,'$..key_name')
  3. #嵌套n层也能取到所有key_name信息,其中:“$”表示最外层的{},“..”表示模糊匹配,当传入不存在的key_name时,程序会返回false
  1. d = {'status': 0, 'msg': 'ok', 'result': {'channel': '头条', 'num': 10,
  2. 'list': [
  3. {'title': '梅森三双陶汉林20+11 郭士强复出广州大胜山东',
  4. 'pic': 'https://n.sinaimg.cn/sports/transform/500/w650h650/20211114/8c8a-87bfba6586cfa9addef8ad88905284f6.jpg'},
  5. {'title': '刘传兴澳洲首秀替补出战9分钟 拿到5分5篮板',
  6. 'pic': 'https://n.sinaimg.cn/sports/transform/274/w650h424/20211114/db25-4c5a40d22677a3ceb698dcb86775ac94.jpg'},
  7. ]}}
  8. print(jsonpath.jsonpath(d,'$.result.list[0]'))
  9. # https://n.sinaimg.cn/sports/transform/500/w650h650/20211114/8c8a-87bfba6586cfa9addef8ad88905284f6.jpg
  10. print(jsonpath.jsonpath(d,'$..title'))
  11. # ['梅森三双陶汉林20+11 郭士强复出广州大胜山东', '刘传兴澳洲首秀替补出战9分钟 拿到5分5篮板']
  12. print(jsonpath.jsonpath(d,'$..msg'))
  13. # ['ok']