JSONPath
JSONPath 是用于在 JSON(JavaScript Object Notation)数据中定位和提取特定元素的查询语言。 它类似于 XPath 对 XML 的作用,可以帮助我们轻松地按照特定的路径表达式从复杂的 JSON 结构中获取所需的数据。
通过指定一个或多个路径表达式,以匹配JSON数据的特定部分。 这些路径表达式由一系列操作符、通配符和属性键组成,用于描述所需数据的位置和结构。 JSONPath 还支持过滤器,可以根据条件筛选出满足要求的数据。
相关文档:
JSONPath 表达式
JSONPath | Description |
---|---|
$ | 根对象/元素。 |
@ | 当前对象/元素。 |
. or [] | 属性访问符。 |
.. | 递归查找。 JSONPath 从 E4X 借用了此语法。 |
* | 通配符。所有对象/元素,无论其名称如何。 |
[] | 下标运算符。 |
[,] | 允许将备用名称或数组索引作为一组。 |
[start:end:step] | 数组切片运算符借用自 ES4。 |
?() | 应用过滤器(脚本)表达式。 |
() | 脚本表达式,使用底层脚本引擎。 |
示例
示例 JSON 数据 example.json
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
}
}
}
python
import json
from jsonpath import jsonpath
class TestJsonPath:
# 初始化类
def setup_class(self):
with open("example.json", "r") as file:
self.data = json.loads(file.read())
# 测试获取第一本书的作者
def test_one_book_author(self):
one_author = jsonpath(self.data, "$.store.book[0].author")
assert one_author == ["Nigel Rees"]
# 测试获取所有书本的作者
def test_all_book_author(self):
all_author = jsonpath(self.data, "$.store.book[*].author")
assert isinstance(all_author, list)
assert len(all_author) == 4
# 获取所有价格大于 10 的书本
def test_all_price_gt_10_book_title(self):
all_title = jsonpath(self.data, "$..book[?(@.price > 10)].title")
assert all_title == ["Sword of Honour", "The Lord of the Rings"]
def test_bicycle_color(self):
color = jsonpath(self.data, "$.store.bicycle.color")
assert color == ["red"]