安装库:
pip install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com jsonpath
使用很简单2行:
from jsonpath import jsonpath
ret = jsonpath(dic, '语法规则字符串')
jsonpath语法规则如下:
语法 | 描述 |
---|---|
$ | 根节点 |
@ | 使用过滤谓词来处理当前节点 |
. or [] | 取子节点 |
n/a | 取父节点,jsonpath未支持 |
… | 就是不管位置,选择符合条件的条件 |
* | 匹配所有元素节点 |
[,] | 支持迭代器中做多选 |
?() | 支持过滤操作 |
() | 支持表达式计算 |
JsonPath语法 | 结果 |
---|---|
$.store.book[*].author | 获取store下book下的所有author值 |
$…author | 获取所有author 的值 |
$.store…price | 获取 store下以及所有子节点下的所有 price |
$…book[2] | 获取 book数组的第3个值 |
$…book[0,1] | 获取 book数组的第一、第二的值 |
$…book[:2] | 获取 book数组从索引 0 (包括) 到 索引 2 (不包括) 的所有值 |
$…book[2:] | 获取 book数组从索引 2 (包括) 到 结尾 的所有值 |
$…book[?(@.isbn)] | 获取 所有节点以及子节点中 book 数组包含 isbn 的所有值 |
$.store.book[?(@.price < 10)] | 获取 store下 book 数组中 price < 10 的所有值 |
…book[?(@.price<=[‘expensive’])] | 获取 所有节点以及子节点下 book 数组中 price <= expensive 的所有值 |
$…book[?(@.author =~ /.*REES/i)] | 获取所有匹配正则的 book ( 不区分大小写 ) |
$…* | 逐层列出 json 中 的所有值,层级由外到内 |
例如提取duration数据
import json
from jsonpath import jsonpath
# 读入示例json数据
with open('json示例.json', encoding='utf-8') as j:
demo_json = json.loads(j.read())
# 配合JSONPath表达式提取数据
jsonpath(demo_json, '$..steps[*].duration')
# 提取所有steps键的子节点对应instruction值
jsonpath(demo_json, '$..steps.*.instruction')
# 多选所有steps键的子节点对应的instruction与action值
jsonpath(demo_json, '$..steps.*[instruction,action]')
# 选择steps键的第0个子节点对应的instruction与action值
jsonpath(demo_json, '$..steps[0][instruction,action]')
# 选择steps键的第1到3(不包括3)个子节点对应的instruction与action值
jsonpath(demo_json, '$..steps[1:3][instruction,action]')
# 配合@,选择steps键的最后一个子节点对应的instruction与action值
jsonpath(demo_json, '$..steps[(@.length-1)][instruction,action]')
# 「条件筛选」
# 找到所有steps子节点中orientation为“西”的
jsonpath(demo_json, '$..steps[?(@.orientation == "西")]')
# 找到所有具有polyline键的节点对应的polyline与road键对应值
jsonpath(demo_json, '$..[?(@.polyline)][polyline,road]')
# 获取结果的JSONPath表达式
jsonpath(demo_json, '$..[?(@.polyline)][polyline,road]', result_type=None)