首页 > 其他分享 >JSONPath,一个事半功倍的查找取数工具

JSONPath,一个事半功倍的查找取数工具

时间:2024-10-20 10:47:35浏览次数:8  
标签:right .. author price 事半功倍 取数 JSONPath book

目录

前言

JSONPath介绍

操作项

筛选器运算符

函数

样本

使用说明

延伸


前言

日常在书写用例断言的时候,经常会遇到这样的场景:从结果中提取关键属性用于后续业务或者断言。

一般遇到这类情况,处理方式基本都跟剥洋葱一样,遇到数组/集合,一层层循环读取,遇到对象套对象,一层层对象点属性点出来。对于要从复杂的结果里面提取关键数据,要写的解析代码很多,有没有办法精简这种提取操作呢?

群众的智慧是强大的,所以结论肯定是有的,而且已经出现很久了,它就是 jmeter 自带的后置处理器之JSON提取器里使用到的库:JSONPath

JSONPath介绍

JSONPath是由Stefan Goessner在2007年左右提出的概念,它是受到XPath(XML路径语言)的启发,设计用于从JSON文档中抽取或筛选指定数据的一种表达式语言。类似于XPath作用于XML文档,JSONPath允许开发者通过特定路径语法来选取JSON对象中的特定部分。

它解决了哪些问题呢?

  1. 零脚本编写,可直接在客户端完成从 JSON 结构中查找和提取数据

  2. 减少和服务端的交互,减少服务器响应带宽的使用

随着语言的发展和JSON 使用场景的不断丰富,目前 JSONPath 已经支持了很多主流语言,如java,js,groovy,php,go  等;

下面以 java 语言为例,举例说明。

操作项

操作项描述
$根元素,所以表达式的开头
@筛选器谓词正在处理的当前节点
*通配符。在需要名称或数字的任何地方可用
..深度扫描。在需要名称的任何地方都可用
.点符号子项,如 $.name
['' (, '')]括号内标注的一个或多个子项
[(,)]数组索引或索引
[start:end]数组切片运算符
[?()]筛选表达式。表达式的计算结果必须为布尔值

筛选器运算符

运算符描述
==left 等于 right(请注意,1 不等于“1”)
!=left 不等于 right
<左边小于右边
<=left 小于或等于 right
>left 大于 right
>=left 大于或等于 right
=~left 匹配正则表达式 [?(@.name =~ /foo.*?/i)]
inleft 存在于右边 [?(@.size 在 ['S', 'M'])] 中
ninleft 在 right 中不存在
subsetofleft 是 right [?(@.sizes 子集 ['S', 'M', 'L'])]
anyofleft 与 right 有交点 [?(@.sizes anyof ['M', 'L'])]
noneof左边与右边没有交点 [?(@.sizes noneof ['M', 'L'])]
sizeleft 的大小(数组或字符串)应与 right 匹配
emptyleft(数组或字符串)应为空

函数

运算符输出类型
min()Double
max()Double
avg()Double
stddev()Double
length()Integer
sum()Double
keys()Set
concat(X)like input
append(X)like input
first()Depends on the array
last()Depends on the array
index(X)Depends on the array

样本

{ "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
    }
  },
  "expensive": 10
}

使用说明

JsonPath使用方式结果
$.store.book[*].author返回书店中所有图书的作者
$..author所有作者
$.store.*返回书店中所有的东西,不仅包括书,还有其他物品,比如自行车
$.store..price返回书店中所有物品的价格
$..book[2]第三本图书
$..book[-2]倒数第二本书
$..book[0,1]前两本书
$..book[:2]从索引 0(含)到索引 2(不含)的所有图书
$..book[1:2]从索引 1(含)到索引 2(不含)的所有图书
$..book[-2:]最后两本书
$..book[2:]从索引 2(含)到最后的所有书籍
$..book[?(@.isbn)]所有带有 ISBN 编号的图书
$.store.book[?(@.price == 10)]返回店内价格等于10元的所有图书
$.store.book[?(@.price < 10)]返回店内价格小于10元的所有图书
$..book[?(@.price <= 10)]返回店内价格小于10元的所有图书
$..book[?(@.author =~ /.*REES/i)]所有与正则表达式匹配的书籍(忽略大小写)
$..*把一切东西都返回
$..book.length()书籍数量

还有一种很奇怪的用法:$..book[?(@.price < $['expensive'])] 返回店内所有不“贵”的书。这里的 $['expensive'] 是获取这个属性对应的值,即$..book[?(@.price<10)]

基础语法到此已介绍完毕,快去实践起来吧。

延伸

  1. 体验工具,网页搜索JSONPATH在线验证,注意有些工具的语法会有些许出入

  2. 如何引入工程里面简化取数逻辑代码呢?通过pom导入jar包,注意jar的版本,不同的版本对应的服务是存在差异的

  3. 也可在自己的工具里面,提供书写表达式窗口来简化自己的工具

标签:right,..,author,price,事半功倍,取数,JSONPath,book
From: https://blog.csdn.net/streamlong/article/details/142983544

相关文章

  • P1004 [NOIP2000 提高组] 方格取数
    要走两次因此,考虑一个四维的数组来实现,然后如果i=k&&j==l的话记得减一次即得到答案。点击查看代码#include<iostream>#include<stack>#include<cmath>#include<algorithm>#include<set>#include<vector>#include<climits>#include<string.h&g......
  • Python爬虫:获取数据的入门详解
    在互联网时代,数据已成为最宝贵的资源之一。Python,作为一种功能强大且易于学习的编程语言,成为了数据获取和处理的理想工具。Python爬虫,特别是,允许我们从网页中自动提取大量数据,为数据分析、机器学习、研究和开发等多种应用提供了原材料。本文将为您提供一个Python爬虫的入门详解......
  • <<迷雾>> 第11章 全自动加法计算机(6)--一只开关取数 示例电路
    用一只开关依次将数取出info::操作说明刚启动时,t0=1,t1=t2=0,此时只有IAR`=1.按下开关K不要松开,地址寄存器AR收到一个上升沿信号,保存住当前地址,并提供给存储器(注:第一个地址为0,所以电路中暂看不出什么变化)松开开关K,循环移位计数器RR得到......
  • datatables使用ajax获取数据
    前端://初始化datatablevartable3=$('.jiaoshi_lst').DataTable({"processing":true,"serverSide":true,"paging":true,"ordering":false,"searching":false......
  • Pandas DataFrame对象df 读取数据
    你的df是一个PandasDataFrame对象,类似于一个表格结构的数据,通常有行和列。根据你的描述,表格中有多列数据,例如TS_CODE,DATE,TIME,OPEN等,总共有33列。要显示df中某个特定项目的值,例如“股票的当前价格”,你可以按照以下方式来操作。假设df里有一列CURRENT_PRICE表......
  • 信息学奥赛复赛复习11-CSP-J2020-04方格取数-动态规划、斐波那契数列、最优子结构、重
    PDF文档公众号回复关键字:202410041P7074[CSP-J2020]方格取数[题目描述]设有n×m的方格图,每个方格中都有一个整数。现有一只小熊,想从图的左上角走到右下角,每一步只能向上、向下或向右走一格,并且不能重复经过已经走过的方格,也不能走出边界。小熊会取走所有经过的方格中......
  • 在Android开发中获取数据的方法有哪些?
    目录1.从SharedPreferences获取数据2.从数据库(SQLite)获取数据3.从文件中读取数据4.从网络请求获取数据(使用HttpURLConnection或OkHttp)5.从内容提供者(ContentProvider)获取数据6.从Intent获取数据7.从Bundle获取数据8.从传感器获取数据9.......
  • Acwing 1027.方格取数
    题目链接算法1(数字三角性模型)这道题是摘花生题目的延申摘花生:走一条路这道题与摘花生题的区别在于走的路数,该题走两条路,而且是两条路同时走的思想。那么按照摘花生的题的思路,能否两条路各自取最大值呢?答案是不行。因为第一次摘花生,第一次的最优解已经影响到第二次的最......
  • 国产linux系统(银河麒麟,统信uos)使用 PageOffice 国产版在线打开 word文件并提取数据区
    PageOffice国产版:支持信创系统,支持银河麒麟V10和统信UOS,支持X86(intel、兆芯、海光等)、ARM(飞腾、鲲鹏、麒麟等)、龙芯(LoogArch)芯片架构。查看本示例演示效果本示例关键代码的编写位置Vue+Springboot注意本文中展示的代码均为关键代码,复制粘贴到您的项目中,按照实际的情况,例如......
  • 使用duxapp开发 React Native App 事半功倍
    Taro的ReactNative端开发提供了两种开发方式,一种是将壳和代码分离,一种是将壳和代码合并在一起开发壳是用来打包调试版或者发版安装包使用的代码是运行在壳上的js代码Taro壳子的代码仓库https://github.com/NervJS/taro-native-shellduxapp中更进一步,你不需要太关注壳子什么......