Python处理json数据(json模块与jsonpath模块)
python处理json数据
之前对json数据有所了解,但是不太熟悉,最近⼯作接触到了许多json数据,所以学习了⼀下,就整理⼀下关于python如何处理json数据的⼀些知识。那接下来就开始吧。
json模块
⾸先推荐两个有助于我们学习json’的⽹址:
、
⼤家看情况打开吧,挺有趣的哦。好了说说json吧。
JSON (JavaScript Object Notation) 是⼀种轻量级的数据交换格式。python3 可以使⽤ json 模块来对 JSON 数据进⾏编解码。
json的两种数据结构:
对象:⽤⼤括号表⽰,由键值对组成,每个键值对⽤逗号隔开。其中key必须为字符串且是双引号,valu
e可以是多种数据类型。
数组:⽤中括号表⽰,每个元素之间⽤逗号隔开。
刚开始我是直接通过json与python的字典来进⾏⽐对学习的,因为ijson中的字符串都要⽤双括号表⽰。可以嵌套表⽰出结构更加复杂的数据。下⾯我们⽐对⼀下python对象与json对象的差别:
Python JSON
dict object
list, tuple array
str string
int, float number
True true
False false
None null
python数据与json数据相互转化
导⼊模块:import json;
python数据转成json字符串:
json_data = json.dumps(python_data);
json字符串转成python对象:
python_data = json.loads(json_data);
python操作json⽂件
把⼀个python类型数据直接写⼊json⽂件
json.dump(data1, open(‘xxx.json’, “w”));
直接从json⽂件中读取数据返回⼀个python对象
python怎么读取json文件data3 = json.load(open(‘xxx.json’));
import requests
import json
import jsonpath
代码:
url="www.lagou/lbs/getAllCitySearchLabels.json"
header ={
'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36" }
response = (url,headers = header)
print('response的类型:',type(response))
#取出json⽂件⾥的内容,返回的格式是字符串
print('html的类型:',type(html))
#把json形式的字符串转换成python形式的Unicode字符串
data=json.loads(html)
print('data的类型:',type(data))
输出结果
response的类型: <class 'dels.Response'>
html的类型: <class 'str'>
data的类型: <class 'dict'>
眼都花了,这怎么看呀,都不知道是啥……好吧,我们输出python字典会好看⼀点(虽然还是有些地⽅很难看,先凑合着,下⾯还有更好看的哦):
相信python字典⼤多数⼈都会去调⽤处理⾥⾯的元素了,那么提取出城市名称应该怎么搞?
for i in range(len(data['content']['data']['allCitySearchLabels']['A'])):
city = data['content']['data']['allCitySearchLabels']['A'][i]['name']
print(city)
这才只把⾸字母为A的城市提取处理了,我们要取得所有城市还得把⾸字母遍历⼀遍,这也太复杂了吧。我们还是换个思路吧,他不是json 数据吗,我们可以通过正则表达式匹配啊哦,不会正则,学呗。嗯,暂时不讲正则,我们搞搞jsonpath,体会以下jsonpath的魅⼒。
jsonpath模块
没有安装的⼩伙伴需要安装⼀下:
pip install jsonpath
我们通过json的⽅式将信息输出⼀下(更好看的⽅式,第⼆个参数别传字符串进来哦,他是字典,需要将json字符串通过json.loads()转为python字典先):
print(json.dumps(data, sort_keys=True, indent=2))# 排序并且缩进两个字符输出,记住别传了字符串进来
输出(节选):
下⾯通过jsonpath提取⼀下所有城市
city_list=jsonpath.jsonpath(data,"$..name")
print('city_list的类型:',type(city_list))#输出为list
#打印每个城市
for i in city_list:
print(i)
把这个列表通过json记录到⽂件中:
array=json.dumps(city_list,ensure_ascii=False)#先转为json数组
with open("lagouCity.json","w", encoding='utf8')as f:
f.write(array)
是不是觉得特别简单,⼀个匹配语句就搞定了,OK,看起来简单,但是怎么写匹配语句我们还是要学习⼀下的。
import jsonpath
print(jsonpath.jsonpath(data,'$..name'))
from jsonpath import jsonpath
print(jsonpath(data,'$..name'))
这两种⽅式任选⼀种即可。下⾯通过与xpath语句来⽐对着学习⼀下jsonpath的语法:
JsonPath与XPath语法对⽐
Json结构清晰,可读性⾼,复杂度低,⾮常容易匹配,下表中对应了XPath的⽤法。
XPath JSONPath描述
/$根节点
.@现⾏节点
/.or[]取⼦节点
.
.n/a取⽗节点,Jsonpath未⽀持
//..就是不管位置,选择所有符合条件的条件
**匹配所有元素节点
@n/a根据属性访问,Json不⽀持,因为Json是个Key-value递归结构,不需要。
[][]迭代器标⽰(可以在⾥边做简单的迭代操作,如数组下标,根据内容选值等)
\|[,]⽀持迭代器中做多选。
[]?()⽀持过滤操作.
n/a()⽀持表达式计算
()n/a分组,JsonPath不⽀持
⼤家可以⾃⾏通过语句再好好练习⼀下,你肯定也会爱上⽤这种⽅式去提取的。希望对你有帮助,求纠错求赞,哈哈。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论