JsonPath 介绍及日常使用教程

📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)

📝 职场经验干货:

软件测试工程师简历上如何编写个人信息(一周8个面试)

软件测试工程师简历上如何编写专业技能(一周8个面试)

软件测试工程师简历上如何编写项目经验(一周8个面试)

软件测试工程师简历上如何编写个人荣誉(一周8个面试)

软件测试行情分享(这些都不了解就别贸然冲了.)

软件测试面试重点,搞清楚这些轻松拿到年薪30W+

软件测试面试刷题小程序免费使用(永久使用)


一、引言

在软件测试工作中,尤其是涉及到对接口返回的 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 方面有所帮助。

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值