JsonPath是一种简单的方法来提取给定JSON文档的部分内容。 JsonPath有许多编程语言,如Javascript,Python和PHP,Java。
JsonPath提供的json解析非常强大,它提供了类似正则表达式的语法,基本上可以满足所有你想要获得的json内容。
Json结构清晰,可读性高,复杂度低,非常容易匹配,其结合方式类似Xpath,为了方便记忆
下表中列出了对应了JSONPath以及对应的XPath用法。
XPath | JSONPath | 描述 |
---|---|---|
/ | $ | 根节点 |
. | @ | 现行节点 |
/ | .or[] | 取子节点 |
.. | n/a | 取父节点,Jsonpath未支持 |
// | .. | 就是不管位置,选择所有符合条件的条件 |
* | * | 匹配所有元素节点 |
@ | n/a | 根据属性访问,Json不支持,因为Json是个Key-value递归结构,不需要属性访问。 |
[] | [] | 迭代器标示(可以在里边做简单的迭代操作,如数组下标,根据内容选值等) |
\| | [,] | 支持迭代器中做多选。 |
[] | ?() | 支持过滤操作. |
n/a | () | 支持表达式计算 |
() | n/a | 分组,JsonPath不支持 |
使用规则
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 | 结果 |
---|---|---|
/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结构的所有成员。 |
综合案例
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)