JSONPATH 学习
- 终究还是学了这个…..
- 一开始我是拒绝的..
- 直到我看到一坨 JSON
- 而我要一层层的找到内部的数据
- 在 Python 中找错了一堆红….
json_data = {
'key': '666',
"sites": [
{"name": "百度", "url": "www.baidu.com"},
{"name": "360", "url": "www.360.com"},
{"name": 'Google', 'list': [
{'url': 'https://www.google.com'},
]}
],
"test": {
'key': '777',
'key1': '1',
'key2': '2',
'key3': '3',
"key_list1": [1, 2, 3, 4],
"key_list2": [1, 2, 3, 4],
}
}
以下操作都基于上面的 json
- 获取根节点所有数据:
$.*
- $ 代表根节点
- . 是当前节点
- * 通配符
- 获取到的是 sites 和 test 内部的数据,不包含外部标签
- 获取 test 节点下数据:
$.test
- 其他就一直…操作下去就好了,下面多一点别的操作
- 遍历所有节点,获取名字为 key 的节点值:
$..key
- 获取所有数据:
$..*
- 获取所有数据:
- 获取 sites 列表中,所有的 name:
$.sites[*].name
or
$.sites..name
- 获取 sites 中所有的 url:
$.sites..url
- 获取 sites 中第三字典信息:
$.sites[2]
- 获取 sites 中前两个信息:
$.sites[0:2]
- 注意再使用分组的时候,目标需要是一个列表,废话…
- 在 Python 中如果想获取最后一个,不能写 [-1] 需要加一个
: - [-1:]
- 获取最后一个列表信息:
$.sites[-1:]
- 找到所有节点中包含 url 的:
$..*[?(@.url)]
- 找所有节点中,name 是 360 的节点:
$..*[?(@.name==360)]
- 这里要注意,如果在 json 中,节点是字符串,那么表达式也要是字符串
- 如果是数字,就要是数字,外面不能有引号
- 等于号需要有两个…
找到一个列表中指定的一个:
$..ip[(@.length-2)]
- 其中
length
返回的是前面ip
的长度 -2
代表列表长度-2
,结果作为索引进行取值。
- 其中
找到列表中
age
小于 100 的节点:$..*[?(@.age < 1000)]
- 注意:这里的 age 节点存储数据需要是 数字类型
and
操作,匹配同时有两个属性的节点:$..*[?(@.age and @.name)]
and
和&&
都可以。- 试了一下
or
,好像没用。
in
操作:匹配指定节点属性,存在于列表中:$..*[?(@.age in ['777','888',999])]
- 区分 数字 字符串
在官网看到还可以正则表达式,各种通配符,在 Python 好像有一些不适用
比如正则,大小,如果后期学到再补充。。。
简简单单的学一下,对你有巨大帮助