Python处理json数据(json模块与jsonpath模块)

python处理json数据

之前对json数据有所了解,但是不太熟悉,最近工作接触到了许多json数据,所以学习了一下,就整理一下关于python如何处理json数据的一些知识。那接下来就开始吧。

json模块

首先推荐两个有助于我们学习json’的网址:

大家看情况打开吧,挺有趣的哦。好了说说json吧。
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。python3 可以使用 json 模块来对 JSON 数据进行编解码。

json的两种数据结构:

  • 对象:用大括号表示,由键值对组成,每个键值对用逗号隔开。其中key必须为字符串且是双引号,value可以是多种数据类型。
  • 数组:用中括号表示,每个元素之间用逗号隔开。

刚开始我是直接通过json与python的字典来进行比对学习的,因为ijson中的字符串都要用双括号表示。可以嵌套表示出结构更加复杂的数据。下面我们比对一下python对象与json对象的差别:

PythonJSON
dictobject
list, tuplearray
strstring
int, floatnumber
Truetrue
Falsefalse
Nonenull

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对象
    data3 = json.load(open(‘xxx.json’));

这四个算是最常用的语句了。我们在做爬虫的时候经常会遇到json数据,下面通过一个拉钩网中的例子来看看,获取到的json数据怎么处理。
http://www.lagou.com/lbs/getAllCitySearchLabels.json
导入模块

import requests
import json
import jsonpath

代码:

url="http://www.lagou.com/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 = requests.get(url,headers = header) 
print('response的类型:', type(response))
#取出json文件里的内容,返回的格式是字符串
html=response.text
print('html的类型:', type(html)) 
#把json形式的字符串转换成python形式的Unicode字符串
data=json.loads(html)
print('data的类型:', type(data))

输出结果

response的类型: <class 'requests.models.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的用法。

XPathJSONPath描述
/$根节点
.@现行节点
/.or[]取子节点
..n/a取父节点,Jsonpath未支持
//..就是不管位置,选择所有符合条件的条件
**匹配所有元素节点
@n/a根据属性访问,Json不支持,因为Json是个Key-value递归结构,不需要。
[][]迭代器标示(可以在里边做简单的迭代操作,如数组下标,根据内容选值等)
\|[,]支持迭代器中做多选。
[]?()支持过滤操作.
n/a()支持表达式计算
()n/a分组,JsonPath不支持

大家可以自行通过语句再好好练习一下,你肯定也会爱上用这种方式去提取的。希望对你有帮助,求纠错求赞,哈哈。

  • 2
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值