在接口测试的场景编排中, 少不了与JSONPath打交道,经常需要获取json中的某个值,并保存成变量供后面的请求进行调用或断言。

# 示例 JSON

{
  "store": {
    "book": [
      {
        "category": "计算机",
        "author": "卢西亚诺.拉马略",
        "title": "流畅的Python(第2版)",
        "price": 99.90
      },
      {
        "category": "计算机",
        "author": "朱雷",
        "title": "Python工匠:案例、技巧与工程实践",
        "price": 49.90
      },
      {
        "category": "艺术",
        "author": "宁思潇潇",
        "title": "新摄影笔记",
        "price": 99.00
      },
      {
        "category": "心理",
        "author": "周岭",
        "title": "认知觉醒:开启自我改变的原动力",
        "price": 59.80
      }
    ]
  }
}

# JSONPath 语法总结

语法 描述 示例
$ 根节点 $.store.book
@ 当前节点,通常用于过滤操作 $.store.book[?(@.price < 50)]
. 选择子节点 $.store.book[0].title
[] 选择数组元素,通过下标或条件选择 $.store.book[0]
[] 和 , 选择多个数组元素 $.store.book[0,2]
[start:end:step] 数组切片 $.store.book[0:2]
* 通配符,选择所有元素 $.store.book[*].title
.. 递归搜索所有子节点 $.store..price
?() 过滤表达式 $.store.book[?(@.price > 90)]

# 常见的过滤表达式

以下表达式在Python的jsonpath库下测试通过,还有些强大的语法需要jsonpath-ngJMESPath库才支持,但不在此多做介绍。

过滤表达式 说明 示例
@.price < 50 选择价格小于 50 的书籍 $.store.book[?(@.price < 50)]
@.price < 50 && @.category == '计算机' 选择价格小于 50 且类别为计算机的书籍 $.store.book[?(@.price < 50 && @.category == '计算机')]
@.author == '周岭' 选择作者为周岭的书籍 $.store.book[?(@.author == '周岭')]
@.price >= 90 && @.price <= 100 选择价格在 90 到 100 之间的书籍 $.store.book[?(@.price >= 90 && @.price <= 100)]
@.category in ['艺术', '心理'] 选择类别为艺术或心理的书籍 $.store.book[?(@.category in ['艺术', '心理'])]