Java - JsonPath 特殊场景解决方案

我们先看下JSONPath的使用,这里使用的是 GitHub - json-path/JsonPath: Java JsonPath implementation,其README中已经提供了相关的介绍和使用示例,这里再简单介绍下,我们这里直接使用其中的示例数据。

{"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
}
  1. JSONPath的表达式都是以 $ 开始,表示根节点

  2. 属性值获取:子节点可以使用 .<name> 来进行表示,如: $.store.bicycle.color 或者 $['store']['bicycle']['color']可以获取其中的color值

  3. 获取多个属性值:JSONPath表达式最后一级子节点可以同时获取多个值,如 $['store']['bicycle']['color', 'price']

  4. 数组数据获取:可以根据索引获取指定位置元素,如: $.store.book[0,1] 或者 $.store.book[:2] 或者 $.store.book[-1]

  5. 可以使用通配符*进行匹配,如:$.store.book[*] 或者 $.store.bicycle.*

  6. 深度查找可以使用..<name>来对属性进行查找,而不管它的具体位置,如:$..price

  7. 属性/数组过滤可以使用[?(<expression>)],其中的表达式需要能解析为boolean值,如:$.store.bicycle[?(@.color=='red')] 或者 $.store.book[?(@.price < 10)]

  8. 函数使用:可以使用lengh()等函数,如:$.store.book.length() 、$.numbers.sum()

  • 相关API用法如下
final JsonPath compile = JsonPath.compile("$.store.book[0].author");
String json = "...";
final String author = compile.read(json);// 或者如果不重复使用的话,可以直接写成一步
List<String> authors = JsonPath.read(json, "$.store.book[*].author");// 函数使用(需要注意函数能作用的数据类型,如 min(), max(), sum()等只能作用于数值数组)
String json = "{\"numbers\":[1,3,4,7,-1]}";
final Object read = JsonPath.read(json, "$.numbers.sum()"); // 输出:14.0
  • 除此之外,JsonPath还提供了一些额外的配置项,以仓库中的 json 为例子
[{"name" : "john","gender" : "male"},{"name" : "ben"}
]
  • DEFAULT_PATH_LEAF_TO_NULL

叶子节点找不到时默认为null: 正常情况下通过Path找不到数据值,JsonPath会抛出异常(使用了通配符如[*]等除外,这种找不到路径是会返回空集合),增加此配置后在叶子结点找不到数据时会返回null 而不是异常(仅限叶子结点,中间节点不存在时仍然会抛出异常)

Configuration configuration =    Configuration.builder().options(Option.DEFAULT_PATH_LEAF_TO_NULL).build();
Object data = JsonPath.using(configuration).parse(json).read("$[1]['gender']");// data == null
  • ALWAYS_RETURN_LIST

不管JsonPath获取的结果是单个值还是集合,都会包装成集合返回

Configuration configuration = Configuration.builder().options(Option.DEFAULT_PATH_LEAF_TO_NULL, Option.ALWAYS_RETURN_LIST).build();
Object data = JsonPath.using(configuration).parse(json).read("$[*]['gender']");// data == ["male",null]// 如果默认使用的话,默认会数组对象key不存在的话会错位上去,所以业务中如果同时有需求的话,生成 2 个 DocumentContext 去操作比较好
Object data = JsonPath.parse(json).read("$[*]['gender']");
  • SUPPRESS_EXCEPTIONS

当处理发生异常时,如果配置了 ALWAYS_RETURN_LIST,则返回空集合,否则返回 null

Configuration configuration = Configuration.builder().options(Option.ALWAYS_RETURN_LIST, Option.SUPPRESS_EXCEPTIONS).build();
Object data = JsonPath.using(configuration).parse(json).read("$[0]['abc']['def']");// data = []
  • REQUIRE_PROPERTIES

路径中属性不存在时,会抛出异常,因为本身路径不存在就会抛出异常,所以这个配置主要体现在配置通配符的场景下,且如果同时配置了 SUPPRESS_EXCEPTIONS, 则 SUPPRESS_EXCEPTIONS 优先(不会抛出异常)

Configuration configuration = Configuration.builder().options(Option.ALWAYS_RETURN_LIST).build();
Object data = JsonPath.using(configuration).parse(json).read("$[*]['gender']");// 抛出异常
  • 值替换

以上主要是读取的操作,同时它还支持对数据进行修改,调用对应的 set 方法即可

String newJson = JsonPath.parse(json).set("$['store']['book'][0]['author']", "Paul").jsonString();

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

macOS 安装a d b

brew install android-platform-tools

Go微服务: 日志系统ELK的应用

概述 基于前文&#xff0c;我们已经了解并搭建完成ELK的所有环境了&#xff0c;现在我们来结合应用程序来使用ELK参考前文&#xff1a;https://active.blog.csdn.net/article/details/138898538 封装日志模块 在通用工具模块: gitee.com/go-micro-services/common 这个包是通…

CTFHUB技能树——SSRF(三)

目录 URL Bypass 数字IP Bypass 302跳转 Bypass DNS重绑定 Bypass SSRF绕过方法&#xff1a; &#xff08;1&#xff09; http://abc.com127.0.0.1 &#xff08;2&#xff09;添加端口号 http://127.0.0.1:8080 &#xff08;3&#xff09;短地址 htt…

限制U盘使用:企业数据安全的软件解决方案

在当今数字化办公环境中&#xff0c;U盘作为一种便捷的数据传输工具&#xff0c;其使用在企业内部非常普遍。然而&#xff0c;U盘的不当使用也给企业数据安全带来了巨大风险。为了防止数据泄露和病毒传播&#xff0c;企业需要采取有效的软件解决方案来限制U盘的使用。本文将探讨…

linux使用dockerCompose脚本化部署镜像

1.根据实际修改docker-compose.yml文件&#xff1a; version: 3.5 services:#mysql数据库脚本mysql:image: 镜像名:版本 #需要查看本地镜像进行填写。同下container_name: mysql #容器名&#xff0c;同下restart: alwaysports:- 3306:3306 #第一个3306为主机…

Java中解决跨域的几种方法

一、 什么是跨域(同源策略) 同源的定义&#xff1a;如果两个页面的协议&#xff0c;端口&#xff08;如果有指定&#xff09;和主机都相同&#xff0c;则两个页面具有相同的源 1&#xff0c;用户在浏览器输入的URL中包含的协议、域名、端口都完全相同。如果有一项不同&#xf…

【python005】python批量、动态调参请求接口(已更新)

1.熟悉、梳理、总结项目研发实战中的Python开发日常使用中的问题。随着版本更新,做了一些变动,如商业化限制,取消一些语法等。 2.欢迎点赞、关注、批评、指正,互三走起来,小手动起来! 文章目录 1.背景介绍2.单次接口请求总结代码片3.批量循环接口请求总结代码片4.持久化`…

机器人流程自动化与低代码流程自动化:技术革新的双重驱动

在数字化时代的浪潮中&#xff0c;企业对于高效、智能的工作流程的需求日益增强。在这一背景下&#xff0c;机器人流程自动化&#xff08;RPA&#xff09;和低代码流程自动化&#xff08;Low-Code Automation&#xff09;应运而生&#xff0c;成为推动企业数字化转型的重要力量…

docker容器安装mysql

linux: centOS-7 hadoop: 3.3.6 前置章节&#xff1a; (图文并茂)基于CentOS-7搭建hadoop3.3.6大数据集群-CSDN博客 可选&#xff1a;zookeeper安装教程-CSDN博客 1.安装docker 1.1 添加docker的repo源 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/…

一个月速刷leetcodeHOT100 day08 两道DP题 一道子串

和为k的子数组 中等 提示 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1&#xff1a; **输入&#xff1a;**nums [1,1,1], k 2 **输出&#xff1a;**2 示例 2&#xff1a; *…

集合、Collection接口特点和常用方法

1、集合介绍 对于保存多个数据使用的是数组&#xff0c;那么数组有不足的地方。比如&#xff0c; 长度开始时必须指定&#xff0c;而且一旦制定&#xff0c;不能更改。 保存的必须为同一类型的元素。 使用数组进行增加/删除元素的示意代码&#xff0c;也就是比较麻烦。 为…

一种简单实用的ollvm反混淆的方案与源码

我是一名从事反欺诈&风控&设备指纹相关的工作&#xff0c;最近对ollvm的如何逆向的问题进行了学习与思考。 ollvm是一个开源免费的so混淆工具&#xff0c;对于逆向的小白来说简直是灾难性的存在。 这个例子是超简单&#xff0c;我想每个人都可以学会跟掌握&#xff0c;…

RustGUI学习(iced/iced_aw)之扩展小部件(二十五):如何使用tab部件来创建tab多页面切换?

前言 本专栏是学习Rust的GUI库iced的合集,将介绍iced涉及的各个小部件分别介绍,最后会汇总为一个总的程序。 iced是RustGUI中比较强大的一个,目前处于发展中(即版本可能会改变),本专栏基于版本0.12.1. 概述 这是本专栏的第二十五篇,主要讲述tab页面切换部件的使用,会结…

[linux] bash中的单引号(‘)和双引号(“)

在命令行中&#xff0c;单引号()和双引号(")在某些情况下会有不同的效果&#xff0c;尤其是在涉及bash变量和特殊字符的解析时。在你给出的两个命令中&#xff1a; ps -ef|grep "tokenize"|grep -v grep|awk {print $2} 和 ps -ef|grep "tokenize"…

PCL点云边界提取——源码解析

文章目录 一、概述二、PCL边缘检测源码定位过程1、初始化2、检查输入点云是否稠密3、迭代处理每个点4、输出三、修改后的过程调用一、概述 在PCL中集成了一个非常经典的点云边缘检测算法,这个算法也在 PCL点云边界提取这篇博客中讲解了。该文章只介绍了AC算法的原理及接口调用…

hook中useContext到底怎么用

语法: somecontext createContext(defaultValue); 作用: 避免了组件嵌套太深, 顶层变量层层传递的麻烦. 如何消费顶层数据 第一步: 用createContext声明一个context上下文变量 import { createContext } from react;export const GlobalContext createContext({} as any);…

面试问题小结

说说你的项目&#xff0c;从里面学到啥了&#xff08;随便说&#xff09; CAS 线程池 的各个方面 线程咋创建&#xff08;4种方式&#xff09; 说一下聚集索引和非聚集索引 50w男 50w女 &#xff0c;在B树中咋存储的&#xff08;类似下面的图&#xff0c;变通一下就行了&a…

本是梦中人,常作花下客。心中自往来,知我有几个。

我们总是喜欢拿“顺其自然”来敷衍人生道路上的荆棘坎坷&#xff0c;却很少承认&#xff0c;真正的顺其自然&#xff0c; 其实是竭尽所能之后的不强求&#xff0c; 而非两手一摊的不作为。 一花凋零荒芜不了整个春天&#xff0c; 一次挫折也荒废不了整个人生。 多年后&#x…

近临算法(个人总结版)

背景 近邻算法&#xff08;Nearest Neighbor Algorithm&#xff09;是一种基本但非常有效的分类和回归方法。最早由Fix和Hodges在1951年提出&#xff0c;经过几十年的发展和改进&#xff0c;已成为数据挖掘、模式识别和机器学习领域的重要工具。近邻算法基于相似性原则&#x…

通过el-tree自定义渲染网页版工作目录,实现鼠标悬浮显示完整名称、用icon区分文件和文件夹等需求

目录 一、通过el-tree自定义渲染网页版工作目录 1.1、需求介绍 1.2、使用el-tree生成文档目录 1.2.1、官方基础用法 ①效果 ②代码&#xff1a; 1.2.2、自定义文档目录&#xff08;实现鼠标悬浮显示完整名称、用icon区分文件和文件夹&#xff09; ①效果&#xff08;直接效…