基本语法

JSONPath语法元素和对应XPath元素的对比

XPathJSONPathDescription
/$根元素
.@当前元素
/. or []子元素
..n/a父元素
//..递归下降,JSONPath是从E4X借鉴的。
**通配符,表示所有的元素
@n/a属性访问字符
[][]子元素操作符
[,]连接操作符在XPath 结果合并其它结点集合。JSONP允许name或者数组索引。
n/a[start: end: step]数组分割操作从ES4借鉴。
[]?()应用过滤表示式
n/a()脚本表达式,使用在脚本引擎下面。
()n/aXpath分组

示例对比

XPathJSONPath结果
/store/book/author$.store.book[*].author书点所有书的作者
//author$..author所有的作者
/store/*$.store.*store的所有元素。所有的bookst和bicycle
/store//price$.store..pricestore里面所有东西的price
//book[3]$..book[2]第三个书
//book[last()]$..book[(@.length-1)]最后一本书
//book[position() < 3]$..book[0,1] $..book[:2]前面的两本书
//book[isbn]$..book[?(@.isbn)]过滤出所有的包含isbn的书。
//book[price<10]$..book[?(@.price<10)]过滤出价格低于10的书。
//*$..*所有元素。

xpath索引下标是从1开始的
jsonpath索引下标是从0开始

Python中使用

安装依赖

pip install jsonpath

代码示例

# -*- coding: utf-8 -*-

import jsonpath

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
             }
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    }
}

ret = jsonpath.jsonpath(data, '$.store.book[*].author')
print(ret)
# ['Nigel Rees', 'Evelyn Waugh']


ret = jsonpath.jsonpath(data, '$..author')
print(ret)
# ['Nigel Rees', 'Evelyn Waugh']

ret = jsonpath.jsonpath(data, '$.store..price')
print(ret)
# [8.95, 12.99, 19.95]

ret = jsonpath.jsonpath(data, '$..book[1].title')
print(ret)
# ['Sword of Honour']

ret = jsonpath.jsonpath(data, '$..book[?(@.price<10)].title')
print(ret)
# ['Sayings of the Century']

参考

  1. https://goessner.net/articles/JsonPath/
  2. JSONPath-简单入门
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐