1 简介
2 官方实例
下边是官方给出的一个JSON实例数据,便于后续分析:
{ "store" : {
"book" : [
{ "category" : "reference" ,
"author" : "Nigel Rees" ,
"title" : "Sayings of the Century" ,
"price" : 8.95
},
{ "category" : "fiction" ,
"author" : "Evelyn Waugh" ,
"title" : "Sword of Honour" ,
"price" : 12.99
},
{ "category" : "fiction" ,
"author" : "Herman Melville" ,
"title" : "Moby Dick" ,
"isbn" : "0-553-21311-3" ,
"price" : 8.99
},
{ "category" : "fiction" ,
"author" : "J. R. R. Tolkien" ,
"title" : "The Lord of the Rings" ,
"isbn" : "0-395-19395-8" ,
"price" : 22.99
}
],
"bicycle" : {
"color" : "red" ,
"price" : 19.95
}
}
}
3 JsonPath与XPath语法对比
Xpath
JsonPath
描述 /
$
根节点 .
@
现行节点 /
. 或 []
取子节点 …
无 取父节点,Jsonpath
未支持 @
无 根据属性访问,Jsonpath
未支持,因为Json
是个Key-value
递归结构,不支持属性访问 *
*
匹配所有元素节点 []
[]
迭代器标示(可以在里面做简单的迭代操作,如数组下标,根据内容选值等) 竖线 [,]
支持迭代器中做多选。连接操作符在XPath
结果合并其它结点集合。Jsonpath
允许name
或者数组索引。 []
?()
支持过滤操作 无 [start: end: step]
数组分割操作从ES4借鉴 无 ()
脚本表达式,使用底层脚本引擎。支持表达式计算 ()
无 Xpath
分组;JsonPath
不支持
4 实例说明JsonPath与XPath语法
通过步骤2中的官方实例,简单看下JsonPath
与XPath
语法的区别:
XPath JsonPath 描述 /store/book/author
$.store.book[*].author
获取店内所有书籍的作者 //author
$..author
获取所有作者 /store/*
$.store.*
获取store
的所有元素。所有的book
和bicycle
/store//price
$.store..price
获取store
里面所有东西的价格 //book[3]
$..book[2]
获取第三本书的所有信息 //book[last()]
$..book[(@.length-1)] 或$..book[-1:]
获取最后一本书的所有信息 //book[position()<3]
$..book[0,1] 或 $..book[:2]
获取前面两本书的所有信息 //book[isbn]
$..book[?(@.isbn)]
过滤出所有的包含isbn
的书信息 //book[price<10]
$..book[?(@.price<10)]
过滤出价格低于10的书 //*
$..*
获取所有元素
5 Python中JsonPath模块
pip install jsonpath
6 Python中JsonPath使用
import jsonpath as jp
data = { "store" : {
"book" : [
{ "category" : "reference" ,
"author" : "Nigel Rees" ,
"title" : "Sayings of the Century" ,
"price" : 8.95
},
{ "category" : "fiction" ,
"author" : "Evelyn Waugh" ,
"title" : "Sword of Honour" ,
"price" : 12.99
},
{ "category" : "fiction" ,
"author" : "Herman Melville" ,
"title" : "Moby Dick" ,
"isbn" : "0-553-21311-3" ,
"price" : 8.99
},
{ "category" : "fiction" ,
"author" : "J. R. R. Tolkien" ,
"title" : "The Lord of the Rings" ,
"isbn" : "0-395-19395-8" ,
"price" : 22.99
}
],
"bicycle" : {
"color" : "red" ,
"price" : 19.95
}
}
}
author = jp.jsonpath(data, '$.store.book[*].author' )
print (author)
['Nigel Rees' , 'Evelyn Waugh' , 'Herman Melville' , 'J. R. R. Tolkien' ]
all_aythor = jp.jsonpath(data, '$..author' )
print (all_aythor)
['Nigel Rees' , 'Evelyn Waugh' , 'Herman Melville' , 'J. R. R. Tolkien' ]
book_bicycle = jp.jsonpath(data, '$.store.*' )
print (book_bicycle)
[[{'category' : 'reference' , 'author' : 'Nigel Rees' , 'title' : 'Sayings of the Century' , 'price' : 8.95 }, {'category' : 'fiction' , 'author' : 'Evelyn Waugh' , 'title' : 'Sword of Honour' , 'price' : 12.99 }, {'category' : 'fiction' , 'author' : 'Herman Melville' , 'title' : 'Moby Dick' , 'isbn' : '0-553-21311-3' , 'price' : 8.99 }, {'category' : 'fiction' , 'author' : 'J. R. R. Tolkien' , 'title' : 'The Lord of the Rings' , 'isbn' : '0-395-19395-8' , 'price' : 22.99 }], {'color' : 'red' , 'price' : 19.95 }]
price = jp.jsonpath(data, "$.store..price" )
print (price)
[8.95 , 12.99 , 8.99 , 22.99 , 19.95 ]
last_book = jp.jsonpath(data, '$.store..book[-1:]' )
print (last_book)
[{'category' : 'fiction' , 'author' : 'J. R. R. Tolkien' , 'title' : 'The Lord of the Rings' , 'isbn' : '0-395-19395-8' , 'price' : 22.99 }]
p = jp.jsonpath(data, '$.store..book[?(@.price<10)]' )
print (p)
[{'category' : 'reference' , 'author' : 'Nigel Rees' , 'title' : 'Sayings of the Century' , 'price' : 8.95 }, {'category' : 'fiction' , 'author' : 'Herman Melville' , 'title' : 'Moby Dick' , 'isbn' : '0-553-21311-3' , 'price' : 8.99 }]
7 结合接口测试的实例
http://127.0 .0 .1 /zentao/api.php/v1/tokens
data = {"account" : "admin" , "password" : "123456" }
http://127.0 .0 .1 /zentao/api.php/v1/user
import jsonpath as jp
import requests
import json
base_url = "http://127.0.0.1/zentao/api.php/v1"
token_url = base_url + "/tokens"
info_rurl = base_url + "/user"
header = {"Content-Type" : "application/json" }
data = {"account" : "admin" , "password" : "ZenTao123456" }
r_data = json.dumps(data)
r = requests.post(url=token_url, data=r_data, headers=header)
r_token = jp.jsonpath(r.json(), '$..token' )
print (r_token)
data1 = {"token" : r_token[0 ]}
headers = dict (header, **data1)
r1 = requests.get(url=info_rurl, headers=headers)
print (r1.text)
['14333e8b34595c5d22794e14c401a125' ]
{"profile" :{"id" :1 ,"company" :0 ,"type" :"inside" ,"dept" :0 ,"account" :"admin" ,"role" :
{"code" :"" ,"name" :"" },
"realname" :"admin" ,"pinyin" :"" ,"nickname" :"" ,"commiter" :"" ,"avatar" :null,"birthday" :null,"gender" :"f" ,"email" :"" ,"skype" :"" ,"qq" :"" ,"mobile" :"" ,"phone" :"" ,"weixin" :"" ,"dingding" :"" ,"slack" :"" ,"whatsapp" :"" ,"address" :"" ,"zipcode" :"" ,"nature" :null,"analysis" :null,"strategy" :null,"join" :null,"visits" :5 ,"visions" :",rnd,lite," ,"ip" :"127.0.0.1" ,"last" :"2023-07-31T06:14:45Z" ,"fails" :0 ,"locked" :null,"feedback" :"0" ,"ranzhi" :"" ,"ldap" :"" ,"score" :0 ,"scoreLevel" :0 ,"resetToken" :"" ,"deleted" :"0" ,"clientStatus" :"offline" ,"clientLang" :"zh-cn" ,"admin" :true,"superReviewer" :false,"view" :
{"account" :"admin" ,"programs" :"" ,"products" :"" ,"projects" :"" ,"sprints" :"" }}}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示