JsonPath 介绍及日常使用教程

部署运行你感兴趣的模型镜像

一、引言

在软件测试工作中,尤其是涉及到对接口返回的 JSON 数据进行验证和处理时,我们常常需要从复杂的 JSON 结构中提取特定的数据。JsonPath 就像是一把精准的手术刀,能够帮助我们高效地定位和提取所需的数据。本文将从软件测试工程师的角度出发,详细介绍 JsonPath 的相关知识和日常使用方法。

二、JsonPath 概述

定义

JsonPath 是一种用于在 JSON 数据中定位和提取特定元素的表达式语言,它的作用类似于 XPath 在 XML 数据中的作用。通过 JsonPath 表达式,我们可以方便地从 JSON 对象或数组中获取所需的数据。

优势
  • 简洁高效:可以用简洁的表达式完成复杂的数据提取任务,减少代码量。

  • 灵活性强:支持多种操作符和函数,能够满足不同的查询需求。

  • 跨语言支持:在多种编程语言中都有相应的实现库,方便测试工程师在不同的测试框架中使用。

三、JsonPath 语法基础

根节点与子节点访问
  • 根节点:使用 $ 表示根节点,它代表整个 JSON 数据。

  • 子节点访问:可以使用点号 . 或者中括号 [] 来访问子节点。

示例 JSON 数据:
{
    "store": {
        "book": [
            {
                "category": "fiction",
                "price": 12.99,
                "title": "The Great Gatsby"
            },
            {
                "category": "non-fiction",
                "price": 15.99,
                "title": "Sapiens: A Brief History of Humankind"
            }
        ],
        "bicycle": {
            "color": "red",
            "price": 399.99
        }
    }
}
使用点号访问子节点:
  • $.store.book[0].title:获取第一本书的标题。

  • $.store.bicycle.color:获取自行车的颜色。

使用中括号访问子节点:
  • $['store']['book'][0]['title']:同样获取第一本书的标题。

  • $['store']['bicycle']['color']:获取自行车的颜色。

数组索引

数组索引从 0 开始,用于访问数组中的特定元素。

  • $.store.book[1]:获取第二本书的所有信息。

通配符

*:用于匹配所有元素或属性。

  • $.store.*:选择 store 下的所有子节点。

  • $.store.book[*].price:获取所有书籍的价格。 ..:用于递归地查找所有符合条件的元素。

  • $..book:在整个 JSON 数据中查找所有的 book 元素,无论其嵌套层次多深。

四、常用操作符

过滤操作符 [?()]

用于根据特定条件过滤元素。

  • $.store.book[?(@.price < 15)]:选择所有价格低于 15 的书籍。

  • $.store.book[?(@.category == 'fiction')]:选择所有类别为小说的书籍。

逻辑操作符

支持 &&(与)、||(或)和 !(非)进行逻辑组合。

  • $.store.book[?(@.price < 15 && @.category == 'fiction')]:选择价格低于 15 且类别为小说的书籍。

  • $.store.book[?(@.price < 15 || @.category == 'non-fiction')]:选择价格低于 15 或者类别为非小说的书籍。

算术操作符

支持 +、-、*、/、% 等算术运算。

  • $.store.book[0].price * 2:将第一本书的价格乘以 2。

五、常用函数

length()

用于获取数组或字符串的长度。

  • $.store.book.length():返回 book 数组的长度。

min()、max()

用于获取数组中数字元素的最小值和最大值。

  • $.store.book[*].price.min():返回所有书籍价格的最小值。

  • $.store.book[*].price.max():返回所有书籍价格的最大值。

sum()

用于计算数组中数字元素的总和。

  • $.store.book[*].price.sum():计算所有书籍价格的总和。

六、Python编程语言中的使用

在 Python 中,可以使用 jsonpath-ng 库。首先需要安装该库:pip install jsonpath-ng

from jsonpath_ng import jsonpath, parse

# 示例 JSON 数据
json_data = {
    "store": {
        "book": [
            {
                "category": "fiction",
                "price": 12.99,
                "title": "The Great Gatsby"
            },
            {
                "category": "non-fiction",
                "price": 15.99,
                "title": "Sapiens: A Brief History of Humankind"
            }
        ],
        "bicycle": {
            "color": "red",
            "price": 399.99
        }
    }
}

# 定义 JsonPath 表达式
jsonpath_expression = parse('$.store.book[*].title')

# 查找匹配的结果
matches = [match.value for match in jsonpath_expression.find(json_data)]

# 输出结果
print("书籍标题:", matches)

七、在软件测试中的实际应用

接口测试中的数据验证

在接口测试中,我们经常需要验证接口返回的 JSON 数据是否符合预期。使用 JsonPath 可以方便地提取关键数据进行验证。

示例场景:验证一个获取用户信息的接口返回的用户姓名是否正确。

import requests
from jsonpath_ng import jsonpath, parse

# 发送接口请求
response = requests.get('https://example.com/api/user/1')
json_data = response.json()

# 定义 JsonPath 表达式
jsonpath_expression = parse('$.name')

# 查找匹配的结果
matches = [match.value for match in jsonpath_expression.find(json_data)]

# 验证结果
expected_name = "John Doe"
if matches[0] == expected_name:
    print("用户姓名验证通过")
else:
    print("用户姓名验证失败")
数据提取与转换

在测试过程中,有时需要从 JSON 数据中提取部分数据进行后续处理或转换。 示例场景:从一个包含多个商品信息的 JSON 数据中提取所有商品的价格,并计算总价。

from jsonpath_ng import jsonpath, parse

# 示例 JSON 数据
json_data = {
    "products": [
        {
            "name": "Product 1",
            "price": 10.99
        },
        {
            "name": "Product 2",
            "price": 20.99
        },
        {
            "name": "Product 3",
            "price": 15.99
        }
    ]
}

# 定义 JsonPath 表达式
jsonpath_expression = parse('$.products[*].price')

# 查找匹配的结果
prices = [match.value for match in jsonpath_expression.find(json_data)]

# 计算总价
total_price = sum(prices)

print("商品总价:", total_price)

八、注意事项

  • 性能问题:在处理大规模 JSON 数据时,复杂的 JsonPath 表达式可能会影响性能。尽量使用简单的表达式或结合其他优化方法。

  • 兼容性问题:不同的 JsonPath 实现库可能在语法和功能上存在细微差异,使用时需要注意选择合适的库并了解其特性。

  • 错误处理:在使用 JsonPath 表达式时,可能会出现表达式错误或未匹配到数据的情况,需要进行适当的错误处理。

九、总结

JsonPath 是软件测试工程师在处理 JSON 数据时的得力工具,通过掌握其语法、操作符和函数,以及在不同编程语言中的使用方法,可以高效地完成数据提取和验证任务。在实际测试工作中,合理运用 JsonPath 能够提高测试效率和准确性,帮助我们更好地完成软件测试工作。希望本文对你在使用 JsonPath 方面有所帮助。

AI 在软件测试中的应用:从自动化到智能化的跨越

使用Python脚本生成不同分辨率和格式的视频

自动化测试开发工程师招聘信息综合评价与趋势洞察

Postman 接口测试中前置脚本生成动态变量的实践

AI 辅助生成 Python 脚本解决实际问题案例

AI 赋能测试:智能生成用例的三大核心优势!

原来Python操作数据库这么简单,看完这篇就会!

如何高效进行服务端接口测试?避开这些坑!

领取全栈软件测试工程师学习资料

添加下方小编微信备注"资料"

图片

如果这篇文章觉得对你有点作用,能否帮忙点个关注。顺便给个三连击:点赞、转发和在看。若可以再给我加个星标⭐️就更好了,谢谢你看我的文章,我们下篇再见图片

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 使用JSONPath提取JSON数据的方法 JSONPath是一种用于在JSON数据中进行查询和提取的工具,其功能类似于XPath在XML中的作用[^3]。以下是关于如何使用JSONPath提取JSON数据的具体方法: #### 1. 安装必要的库 为了在Python中使用JSONPath,通常需要安装`jsonpath-ng`或其他支持JSONPath的第三方库。可以通过以下命令安装该库: ```bash pip install jsonpath-ng ``` #### 2. 基本语法介绍 JSONPath提供了多种表达式来定位JSON数据的不同部分。例如: - `$`: 表示根对象。 - `*`: 匹配任意节点。 - `.field_name`: 访问指定字段。 - `[index]`: 访问数组中的某个索引项。 - `?()` : 过滤器表达式。 具体例子如下所示: - 提取所有步骤的持续时间:`$..steps[].duration`[^1]。 - 获取第一个元素:`$.array[0]`。 - 查找满足条件的数据:`$..book[?(@.price<10)]`。 #### 3. 实际操作案例 假设有一个JSON文档如下: ```json { "store": { "book": [ {"category": "fiction", "title": "Book A", "price": 8}, {"category": "non-fiction", "title": "Book B", "price": 15} ], "bicycle": {"color": "red", "price": 19.95} } } ``` 如果要获取价格低于10的所有书籍名称,则可以编写如下代码: ```python from jsonpath_ng import parse # JSON 数据 data = { "store": { "book": [ {"category": "fiction", "title": "Book A", "price": 8}, {"category": "non-fiction", "title": "Book B", "price": 15} ], "bicycle": {"color": "red", "price": 19.95} } } # 解析路径 json_path_expr = parse('$.store.book[?(@.price < 10)].title') # 执行匹配并打印结果 result = [match.value for match in json_path_expr.find(data)] print(result) # 输出 ['Book A'] ``` 上述代码展示了如何利用`parse`函数定义JSONPath表达式,并通过`.find()`方法查找符合条件的结果[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值