JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,Python3 中可以使用 json 模块来对 JSON 数据进行编解码,主要包含4个操作函数:
提示:所谓类文件对象指那些具有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数据类型
import json
d = {
"code": 0,
"msg": "操作成功",
"token":"sdgdgsdgsds"
}
ret = json.dumps(d,ensure_ascii=False) #输出结果中有中文,需要指定ensure_ascii=False
print(ret)
print(type(ret))
输出结果如下:
(二)JSON数据类型换成Python类型
import json
s="""
{
"code": 0,
"msg": "操作成功",
"token":"sdgdgsdgsds"
}
"""
ret = json.loads(s) #json转字典的
print(ret)
print(type(ret))
输出结果如下:
2.1.json.dump()用于将dict类型的数据转成str,并写入到json文件中
# 方法一
with open("student2.json",'w',encoding="utf-8") as f:
json_str = json.dumps(d,ensure_ascii=False,indent=4)
f.write(json_str)
# 方法二
with open("student2.json",'w',encoding="utf-8") as f:
json.dump(d,f,ensure_ascii=False,indent=4)
输出结果如下:
2.2 json.load()用于从json文件中读取数据
# 方法一
with open("student.txt",encoding="utf-8") as f:
dic = json.loads(f.read())
print(dic)
# 方法二
with open("student.txt",encoding="utf-8") as f:
dic = json.load(f)
print(dic)
输出结果如下:
(三) jsonpath
用来解析多层嵌套的json数据;JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本
import jsonpath
res=jsonpath.jsonpath(dic_name,'$..key_name')
#嵌套n层也能取到所有key_name信息,其中:“$”表示最外层的{},“..”表示模糊匹配,当传入不存在的key_name时,程序会返回false
d = {'status': 0, 'msg': 'ok', 'result': {'channel': '头条', 'num': 10,
'list': [
{'title': '梅森三双陶汉林20+11 郭士强复出广州大胜山东',
'pic': 'https://n.sinaimg.cn/sports/transform/500/w650h650/20211114/8c8a-87bfba6586cfa9addef8ad88905284f6.jpg'},
{'title': '刘传兴澳洲首秀替补出战9分钟 拿到5分5篮板',
'pic': 'https://n.sinaimg.cn/sports/transform/274/w650h424/20211114/db25-4c5a40d22677a3ceb698dcb86775ac94.jpg'},
]}}
print(jsonpath.jsonpath(d,'$.result.list[0]'))
# https://n.sinaimg.cn/sports/transform/500/w650h650/20211114/8c8a-87bfba6586cfa9addef8ad88905284f6.jpg
print(jsonpath.jsonpath(d,'$..title'))
# ['梅森三双陶汉林20+11 郭士强复出广州大胜山东', '刘传兴澳洲首秀替补出战9分钟 拿到5分5篮板']
print(jsonpath.jsonpath(d,'$..msg'))
# ['ok']