python在在进行接口关联的时候经常会用到参数提取,对于json格式的提取这个时候jsonpath提取器就很常用,这边主要分享一下jsonpath的详细用法
1.jsonpath的语法
(1)特点:只能提取json格式的数据,提取后的数据类型与原数据类型一致
(2)语法
原字符 | 描述 |
---|---|
$ | 表示根元素 |
@ | 当前元素 |
. or [] | 子元素 |
… | 递归搜索(不管当前路径,搜索符合条件的数据) |
* | 通配符,表示所有的元素 |
[] | 子元素操作符 |
[,] | 支持迭代器中做多选,多个key用逗号隔开 |
[start:end:step] | 数组分割操作,等同于切片 |
?() | 应用过滤表示式 |
(3)jsonpath 提取完的数据是列表,如果想要里面具体的值需要按照列表的方式取其中列表中的值
(4)举例测试数据如下:
{
"success": true,
"result": {
"codeInfo": {
"code": 0,
"msg": "成功"
},
"data": [{
"value": "111",
"des": "验收单A4纸"
},
{
"value": "13",
"des": "任务单打印"
},
{
"value": "12",
"des": "收货核查单"
},
{
"value": "11",
"des": "容器打印"
},
{
"value": "5",
"des": "盘点单"
},
{
"value": "8",
"des": "标签打印"
},
{
"value": "6",
"des": "发货单"
},
{
"value": "4",
"des": "预检单"
},
{
"value": "3",
"des": "出库单"
},
{
"value": "104",
"des": "验收单两联纸"
},
{
"value": "2",
"des": "验收单两联纸"
},
{
"value": "1",
"des": "验收单A4纸"
},
{
"value": "15",
"des": "商品提总单"
},
{
"value": "22",
"des": "生鲜预检单A4"
},
{
"value": "9",
"des": "自提点简编"
},
{
"value": "100",
"des": "验收单A4纸"
},
{
"value": "10",
"des": "自提点提货单"
},
{
"value": "7",
"des": "路线对货单"
},
{
"value": "16",
"des": "周转物出库单打印"
}
]
},
"traceId": "e993891ac238651e92cf8a1da724704e"
}
import jsonpath
json1={
"success": 'true',
"result": {
"codeInfo": {
"code": 0,
"msg": "成功"
},
"data": [{
"value": "111",
"des": "验收单A4纸"
},
{
"value": "13",
"des": "任务单打印"
},
{
"value": "12",
"des": "收货核查单"
},
{
"value": "11",
"des": "容器打印"
},
{
"value": "5",
"des": "盘点单"
},
{
"value": "8",
"des": "标签打印"
},
{
"value": "6",
"des": "发货单"
},
{
"value": "4",
"des": "预检单"
},
{
"value": "3",
"des": "出库单"
},
{
"value": "104",
"des": "验收单两联纸"
},
{
"value": "2",
"des": "验收单两联纸"
},
{
"value": "1",
"des": "验收单A4纸"
},
{
"value": "15",
"des": "商品提总单"
},
{
"value": "22",
"des": "生鲜预检单A4"
},
{
"value": "9",
"des": "自提点简编"
},
{
"value": "100",
"des": "验收单A4纸"
},
{
"value": "10",
"des": "自提点提货单"
},
{
"value": "7",
"des": "路线对货单"
},
{
"value": "16",
"des": "周转物出库单打印"
}
]
},
"traceId": "e993891ac238651e92cf8a1da724704e"
}
res=jsonpath.jsonpath(json1,'$..data') #获取data中所有的数据答案是列表
res1=jsonpath.jsonpath(json1,'$..data[0].value')#获取data中第一个列表中的数据中的valuezh值,答案是一个列表
res2=jsonpath.jsonpath(json1,'$..data[(@.length-1)].value') #获取data中里列表中最后一个数据中value值,答案也是一个列表
print(res)
print(res1)
print(res2)
#输出结果
#res=[[{'value': '111', 'des': '验收单A4纸'}, {'value': '13', 'des': '任务单打印'}, {'value': '12', 'des': '收货核查单'}, {'value': '11', 'des': '容器打印'}, {'value': '5', 'des': '盘点单'}, {'value': '8', 'des': '标签打印'}, {'value': '6', 'des': '发货单'}, {'value': '4', 'des': '预检单'}, {'value': '3', 'des': '出库单'}, {'value': '104', 'des': '验收单两联纸'}, {'value': '2', 'des': '验收单两联纸'}, {'value': '1', 'des': '验收单A4纸'}, {'value': '15', 'des': '商品提总单'}, {'value': '22', 'des': '生鲜预检单A4'}, {'value': '9', 'des': '自提点简编'}, {'value': '100', 'des': '验收单A4纸'}, {'value': '10', 'des': '自提点提货单'}, {'value': '7', 'des': '路线对货单'}, {'value': '16', 'des': '周转物出库单打印'}]]
#res1=['111']
#res2=['16']