Skip to content

JSONPath

JSONPath 是用于在 JSON(JavaScript Object Notation)数据中定位和提取特定元素的查询语言。 它类似于 XPath 对 XML 的作用,可以帮助我们轻松地按照特定的路径表达式从复杂的 JSON 结构中获取所需的数据。

通过指定一个或多个路径表达式,以匹配JSON数据的特定部分。 这些路径表达式由一系列操作符、通配符和属性键组成,用于描述所需数据的位置和结构。 JSONPath 还支持过滤器,可以根据条件筛选出满足要求的数据。

相关文档:

JSONPath - XPath for JSON

JSONPath 表达式

JSONPathDescription
$根对象/元素。
@当前对象/元素。
. 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"]