预计阅读时间: 7 分钟
JsonPath是一种简单的方法来提取给定JSON文档的部分内容。JsonPath有许多编程语言,如Javascript,Python和PHP,Java。
JsonPath提供的json解析非常强大,它提供了类似正则表达式的语法,基本上可以满足所有你想要获得的json内容。
Json结构清晰,可读性高,复杂度低,非常容易匹配,其结合方式类似Xpath,为了方便记忆
下表中列出了对应了JSONPath以及对应的XPath用法。
JsonPath表达式可以使用点表示法
$.store.book [0].title
或括号表示法
$['store']['book'][0]['title']
前面我们提到了jsonpath目前支持多种语言,下面我们以Python为例子进行使用。
pip install jsonpath
import jsonpath
res=jsonpath.jsonpath(dic_name,'$..key_name')
嵌套n层也能取到所有key_name信息,其中:$
表示最外层的{},..
表示模糊匹配,当传入不存在的key_name时,程序会返回false.
XPath
|
JSONPath
|
.or[]
|
取父节点,Jsonpath未支持
|
就是不管位置,选择所有符合条件的条件
|
匹配所有元素节点
|
根据属性访问,Json不支持,因为Json是个Key-value递归结构,不需要属性访问。
|
迭代器标示(可以在里边做简单的迭代操作,如数组下标,根据内容选值等)
|
支持迭代器中做多选。
|
支持过滤操作.
|
支持表达式计算
|
分组,JsonPath不支持
|
shop={
"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
"expensive": 10
import jsonpath
#商店里所有书籍的作者
author_list=jsonpath.jsonpath(shop,'$.store.book[*].author')
print(author_list) #['Nigel Rees', 'Evelyn Waugh', 'Herman Melville', 'J. R. R. Tolkien']
#返回所有的作者
author_list2=jsonpath.jsonpath(shop,'$..author')
print(author_list2) #['Nigel Rees', 'Evelyn Waugh', 'Herman Melville', 'J
#商店里的所有东西
category_dx=jsonpath.jsonpath(shop,'$.store.*')
print(category_dx)
#商店里一切的价格
store_price_list=jsonpath.jsonpath(shop,'$.store..price')
print(store_price_list) #[8.95, 12.99, 8.99, 22.99, 19.95]
#第三本书
book_3=jsonpath.jsonpath(shop,'$..book[2]')
print(book_3)
#最后一本书
num=len(jsonpath.jsonpath(shop,'$..book'))-1
book_last=jsonpath.jsonpath(shop,f'$..book[{num}]')
print(book_last)
#前两本书
book_12=jsonpath.jsonpath(shop,f'$..book[0,1]')
print(book_12)
#过滤所有便宜10以上的书籍
book_lg10=jsonpath.jsonpath(shop,'$..book[?(@.price<10)]')
print(book_lg10)
#使用isbn number过滤所有书籍
book_lg10=jsonpath.jsonpath(shop,'$..book[?(@.isbn)]')
print(book_lg10)
XPath
|
JSONPath
|
/store/book/author
|
$.store.book[*].author
|
商店里所有书籍的作者
|
//author
|
$..author
|
/store/*
|
$.store.*
|
商店里的所有东西,都是一些书和一辆红色的自行车。
|
/store//price
|
$.store..price
|
商店里一切的价格。
|
//book[3]
|
$..book[2]
|
//book[last()]
|
$..book[(@.length-1)]
或者
$..book[-1:]
|
最后一本书。
|
//book[position()<3]
|
$..book[0,1]
或者
$..book[:2]
|
//book[isbn]
|
$..book[?(@.isbn)]
|
使用isbn number过滤所有书籍
|
//book[price<10]
|
$..book[?(@.price<10)]
|
过滤所有便宜10以上的书籍
|
XML文档中的所有元素。JSON结构的所有成员。
|