JsonPath实战

概述

JsonPath,GitHub是一种简单的方法来提取给定JSON文档的部分内容,提供类似正则表达式的语法来解析JSON文档。

特性

入门

引入如下Maven依赖:

<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
</dependency>

基本使用:

JsonPath.read("", "");

需要传入两个String类型的参数,第一个参数为一个JSON String,第二个参数为JsonPath表达式。对应的源码为:

public static <T> T read(String json, String jsonPath, Predicate... filters) {
    return (new ParseContextImpl()).parse(json).read(jsonPath, filters);
}

第三个参数Predicate,表示谓词,在进阶部分会详细讲解。

查看com.jayway.jsonpath.JsonPath源码,不难发现,第一个参数可以替换成Object、File、URL、InputStream类型的JSON,即可以直接读取一个JSON文件或网络资源等。

返回类型可以是用泛型定义的任意对象(<T> T),也可以是一个DocumentContext(用得不多,可以直接忽略)。

JsonPath表达式

从上面的简介,不难得知,使用好JsonPath的基础条件是熟悉JsonPath表达式:

  • JsonPath中的根成员对象始终称为$,无论是对象JSON Object还是数组JSON Array
  • JsonPath表达式支持点表示法
  • 也支持括号表示法,繁琐,不建议使用
  • 解析JSON Array时,支持数组表示法,索引从0开始
  • 数组表示法,和Python 数组语法几乎没有差别
  • *表示所有节点
  • ..表示选择所有符合条件的节点
  • ?()表示过滤操作
  • @表示当前节点

如何校验JsonPath表达式的合法性呢?

JsonPath.compile("$..");

在这里插入图片描述
使用IDEA的话,编译器会给出warning,执行mvn compile可以成功。运行这一行代码,JsonPath给出报错:InvalidPathException: Path must not end with a '.' or '..'

函数支持

函数可以在路径的尾部调用,函数的输出是路径表达式的输出,该函数的输出是由函数本身所决定的。

函数描述输出
min()返回数值类型数组的最小值Double
max()返回数值类型数组的最大值Double
avg()返回数值类型数组的平均值Double
stddev()返回数值类型数组的标准偏差值Double
length()返回数值类型数组的长度Integer

过滤器运算符

?(),表示过滤器,用于筛选数组的逻辑表达式。一个典型的过滤器将是[?(@.age > 18)]@表示正在处理的当前项目。可使用逻辑运算符&&||来创建更复杂的过滤器。字符串文字必须用单引号或双引号括起来:[?(@.color == 'blue')][?(@.color == "blue")]

操作符描述
==left等于right(注意1不等于’1’)
!=不等于
<小于
<=小于等于
>大于
>=大于等于
=~匹配正则表达式[?(@.name =~ /foo.*?/i)]
in左边存在于右边 [?(@.size in [‘S’, ‘M’])]
nin左边不存在于右边
size数组或字符串长度
empty数组或字符串为空

实战

示例JSON文档:

{
  "store": {
    "book": [
      {
        "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95
      },
      {
        "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
}

很简单的一个JSON文档,有两个键值对,其中store表示商场,卖book和bicycle;expensive=10。

$.store.book[0].title表示获取第一本书的标题,测试代码:

log.info(JsonPath.read(jsonStr, "$.store.book[0].title"));

输出:Sayings of the Century

使用括号表示法,$['store']['book'][0]['title'],输出同样是Sayings of the Century

$..book.length()表示获取book这个Array的个数,输出2,测试代码略。

$..book[0,1]表示获取第一、二两本书。
$..book[-2:]表示获取最后两本书。
$..book[:1]表示获取从索引0开始的书籍,索引1不算在内。
$..book[1:2]表示获取从索引1开始的书籍,索引2不算在内。
$..book[1:]表示获取第二本(索引1开始)到最后一本书。

$.store.book[*].author表示获取所有book的作者,输出是一个列表。使用..的话,$..author也表示获取所有作者,输出列表。

$..book[?(@.isbn)]表示获取JSON中book Array里包含isbn编号的书。

$.store.book[?(@.isbn)].author表示获取JSON中book Array里包含isbn编号的书的作者。

$.store.book[?(@.price < 10)]表示获取JSON中book Array里售价低于10的书。

$..book[?(@.price < $['expensive'])]表示获取JSON中book Array里售价低于expensive的书。

支持的常用表达式

JsonPath描述
$根节点
@当前节点
.or[]子节点
..选择所有符合条件的节点
*所有节点
[]迭代器标示,如数组下标
[,]支持迭代器中做多选
[start:end:step]数组切片运算符
?()支持过滤操作
()支持表达式计算

进阶

Exception

以json-path-2.9.0版本为例,共定义8个Exception:

  • InvalidCriteriaException
  • InvalidJsonException
  • InvalidModificationException
  • InvalidPathException
  • JsonPathException
  • PathNotFoundException
  • ValueCompareException
  • EvaluationAbortException
  • MappingException
    在这里插入图片描述

谓词

谓词,谓语,也有翻译成断言的,即Predicate,JsonPath中的过滤器谓词有三种:

  • 内联谓词
  • 过滤器谓词
  • 自定义谓词

内联谓词

List<Map<String, Object>> books =  JsonPath.parse(json).read("$.store.book[?(@.price < 10)]");

可使用&&||结合多个谓词[?(@.price < 10 && @.category == 'fiction')]。使用!否定一个谓词[?(!(@.price < 10 && @.category == 'fiction'))]

过滤谓词

使用Filter API构建:

import static com.jayway.jsonpath.JsonPath.parse;
import static com.jayway.jsonpath.Criteria.where;
import static com.jayway.jsonpath.Filter.filter;
Filter filter = filter(
   where("category").is("fiction").and("price").lte(10D)
);
List<Map<String, Object>> books = parse(json).read("$.store.book[?]", filter);

占位符?为路径中的过滤器。当提供多个过滤器时,它们按照占位符数量与提供的过滤器数量相匹配的顺序应用。可以在一个过滤器操作[?, ?]中指定多个谓词占位符,这两个谓词都必须匹配。

过滤器也可以与ORAND一起使用

Filter fooOrBar = filter(where("foo").exists(true)).or(where("bar").exists(true));
Filter fooAndBar = filter(where("foo").exists(true)).and(where("bar").exists(true));

自定义谓词

Predicate booksWithIsbn = new Predicate() {
    @Override
    public boolean apply(PredicateContext ctx) {
        return ctx.item(Map.class).containsKey("isbn");
    }
};
List<Map<String, Object>> books = reader.read("$.store.book[?].isbn", List.class, booksWithIsbn);

Configuration

Option

源码为com.jayway.jsonpath.Option,枚举类:

  • DEFAULT_PATH_LEAF_TO_NULL:当检索不到时返回null对象,否则如果不配置这个,会直接抛出异常PathNotFoundException
  • ALWAYS_RETURN_LIST:总是返回list,即便是一个确定的非list类型,也会被包装成list
  • AS_PATH_LIST:返回path
  • SUPPRESS_EXCEPTIONS:不抛出异常,需要判断如下:
    • ALWAYS_RETURN_LIST开启,则返回空list
    • ALWAYS_RETURN_LIST关闭,则返回null
  • REQUIRE_PROPERTIES:如果设置,则不允许使用通配符,比如$[*].b会抛出PathNotFoundException异常。

SPI

SPI是
在这里插入图片描述

cache

对应于源码

json

mapper

参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/567067.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用Python将原始边列表转换为邻接矩阵

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在图论和网络分析中&#xff0c;图是一种非常重要的数据结构&#xff0c;它由节点&#xff…

驱动比例换向阀放大器

比例换向阀放大器技术是电液比例系统中关键的组成部分&#xff0c;它主要用于控制比例阀&#xff0c;实现对液压流量或压力的精确控制。 高精度控制&#xff1a;通过比例阀放大器&#xff0c;系统可以非常精确地调节液压流量或压力&#xff0c;这对于要求精密操作的机械系统来说…

DSP系统的设计过程与选型

DSP的设计步骤分几个阶段&#xff0c;应用系统的设计过程如图所示。 技术指标的确定 器件的选型原则 其他因素的考虑

学习c语音的自我感受

因为是自学&#xff0c;所以走过不少弯路。去年&#xff0c;受知乎“python性能弱”风潮的影响&#xff0c;学过go,rust。 在学习这些新语言的时候&#xff0c;由衷感受到&#xff0c;或是本身侧重方向的原因&#xff08;如go侧重服务器&#xff09;&#xff0c;或是语言太新不…

Php-WebView 现代跨平台 GUI分享

GitHub :php-webview 一个用于 C/C 的小型跨平台 Web 视图库&#xff0c;用于构建现代跨平台 GUI。 该项目的目标是为最广泛使用的平台创建一个通用的 HTML5 UI 抽象层。 它支持双向 JavaScript 绑定&#xff08;从 C/C 调用 JavaScript 和从 JavaScript 调用 C/C&#xff09;。…

蛋白质致病突变的计算方法(四)

3.1.5 域定位 (domain location) 残基在序列中的位置可分为N-terminal(1-30%)、中间(31-70%)和C-terminal(71-100%)。Singh等人报告称&#xff0c;TP53的中心和高度保守的DNA结合域包含一簇体细胞错义突变&#xff0c;包括R175、G245、R248和R273。这些突变形成与DNA的直接接触…

Docker 部署 WordPress 并完成建站

什么是 WordPress WordPress 是使用 PHP 语言开发的博客平台&#xff0c;用户可以在支持 PHP 和 MySQL 数据库的服务器上架设属于自己的网站。也可以把 WordPress 当作一个内容管理系统&#xff08;CMS&#xff09;来使用。WordPress 是一款个人博客系统&#xff0c;并逐步演化…

DC-DC电源设计中电感选型详解

电感参数: DC-DC 电感选型步骤: 1, 根据 DC-DC 的输入输出特性计算所需的最小电感量。 (1)对于 Buck 型 DC-DC,计算公式如下 Lmin= 【Vout*(1-Vout/Vinmax)】/ (Fsw*Irpp ) 其中: Vinmax = maximum input voltage Vout = output voltage fsw = switching frequency…

第二届阿里巴巴大数据智能云上编程大赛亚军比赛攻略_北方的郎队

关联比赛: 第二届阿里巴巴大数据智能云上编程大赛-智联招聘人岗智能匹配 查看更多内容&#xff0c;欢迎访问天池技术圈官方地址&#xff1a;第二届阿里巴巴大数据智能云上编程大赛亚军比赛攻略_北方的郎队_天池技术圈-阿里云天池

Pytorch:张量的梯度计算

目录 一、自动微分简单介绍1、基本原理2、梯度计算过程3、示例&#xff1a;基于 PyTorch 的自动微分a.示例详解b.梯度计算过程c.可视化计算图 4、总结 二、为什么要计算损失&#xff0c;为何权重更新是对的&#xff1f;1、梯度下降数学原理2、梯度上升 三、在模型中使用自动微分…

Qt 菜单栏上手教程:QMenuBar QMenu QToolbar

引言 在Qt框架中&#xff0c;QMenuBar、QMenu、QToolbar和QAction都是用于构建应用程序界面中的用户交互元素。 QMenuBar 是什么&#xff1a;QMenuBar是一个用于创建横向菜单栏的类。在桌面应用程序中&#xff0c;它通常位于窗口的顶部。应用场景&#xff1a;当您需要一个包含…

CTF小工具

1 ciphey https://github.com/Ciphey/Ciphey Ciphey 是一个使用自然语言处理和人工智能的全自动解密/解码/破解工具。 简单地来讲&#xff0c;你只需要输入加密文本&#xff0c;它就能给你返回解密文本。就是这么牛逼。 有了Ciphey&#xff0c;你根本不需要知道你的密文是哪…

ros2_control【B站WMGIII教学学习记录】1

资源 https://www.bilibili.com/video/BV1ku411G7UR? 学习过程中存在bug&#xff0c;记录一下 1 Q:"package ‘joint_state_publisher_gui’ not found, searching: [/home A: sudo apt install ros-humble-joint-state-publisher2 https://fishros.org.cn/forum/to…

如何高效的压缩GIF图片?一键搞定GIF动图压缩 就是这么简单

一&#xff0c;引言 压缩GIF动图是一个常见的需求&#xff0c;无论是在社交媒体上分享动态表情&#xff0c;还是在网页设计中添加动态元素&#xff0c;GIF动图都扮演着重要的角色。然而&#xff0c;过大的GIF文件大小可能会导致加载速度慢&#xff0c;影响用户体验。因此&…

Github首页美化(updating)

Github首页美化 https://github.com/QInzhengk一、新建仓库二、美化Github首页主页访问量统计仓库状态统计常用语言占比统计社交链接 界面展示 https://github.com/QInzhengk 一、新建仓库 对Github首页进行美化&#xff0c;需要新建一个仓库名和自己 Github 用户名相同的仓库…

YOLC: You Only Look Clusters for Tiny Object Detection in Aerial Images

摘要 由于以下因素,从航拍图像中检测物体面临着重大挑战:1)航拍图像通常具有非常大的尺寸,通常有数百万甚至数亿像素,而计算资源有限。2)物体尺寸较小导致有效信息不足,无法进行有效检测。3)物体分布不均匀导致计算资源浪费。为了解决这些问题,我们提出YOLC(You Onl…

Python ADTK库:时间序列异常检测的利器

更多Python学习内容&#xff1a;ipengtao.com ADTK&#xff08;Anomaly Detection Toolkit&#xff09;是一个用于时间序列异常检测的Python库&#xff0c;提供了多种算法和工具&#xff0c;帮助用户识别和分析时间序列数据中的异常点和趋势变化。本文将详细介绍ADTK库的功能、…

2024年学浪视频怎么缓存

2024年已经到来&#xff0c;越来越多的人开始购买学浪视频&#xff0c;然而一些课程的时间限制使得许多人希望能够永久保存这些宝贵的学习资源。幸运的是&#xff0c;本文将向大家介绍一个解决方案——使用小浪助手工具来下载学浪视频&#xff0c;以便随时随地享受学习的乐趣。…

C++实战演练---负载均衡在线oj项目预热

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 前言 学习准备了快一年时间&#xff0c;心心念念的实战演练终于可以开始了&#xff0c;话不多说&#xff0c;直接进入主题…

从构成看自来水厂自动化控制系统的创新与发展

自来水厂自动化控制系统涵盖了多个关键组成部分&#xff0c;包括水管理云平台、供水监控系统以及供水调度平台。 系统内嵌了一系列自主创新的核心算法&#xff0c;这些算法结合了数学建模、机器仿真和流体力学等多元数据模型&#xff0c;以优化设备间的关联和控制关系&#xf…