JSON对象处理工具类
目录
1. 工具类的功能设计
2. 工具类的实现
依赖配置
工具类代码
3. 工具类的使用示例
示例1:美化JSON打印
示例2:从JSON中提取数据
示例3:修改JSON数据
示例4:合并JSON对象
4. 总结
在现代软件开发中,JSON(JavaScript Object Notation)是一种广泛使用的轻量级数据交换格式。由于其简洁性和易读性,JSON被广泛应用于API通信、配置文件、数据存储等场景。然而,在处理JSON数据时,我们常常会遇到以下问题:
- JSON打印不美观:默认的JSON字符串通常是紧凑的,不易阅读。
- 数据处理繁琐:从JSON中提取或修改数据时,代码冗长且容易出错。 为了解决这些问题,我们可以编写一个工具类,优化JSON对象的打印和数据处理。本文将详细介绍如何实现这样一个工具类,并提供示例代码。
1. 工具类的功能设计
我们的工具类JsonUtils将提供以下功能:
- 美化JSON打印:将JSON字符串格式化为易读的多行格式。
- 从JSON中提取数据:通过路径(如
user.name)从JSON对象中提取值。 - 修改JSON数据:通过路径修改JSON对象中的值。
- 合并JSON对象:将多个JSON对象合并为一个。
2. 工具类的实现
依赖配置
首先,我们需要引入Jackson库,它是一个流行的JSON处理库。在Maven项目中添加以下依赖:
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.3</version>
</dependency>
工具类代码
以下是JsonUtils工具类的实现:
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
public class JsonUtils {private static final ObjectMapper mapper = new ObjectMapper();/*** 将JSON字符串格式化为易读的多行格式*/public static String prettyPrint(String json) throws JsonProcessingException {JsonNode node = mapper.readTree(json);return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(node);}/*** 从JSON对象中提取值** @param json JSON字符串* @param path 路径(如 "user.name")* @return 提取的值,如果路径不存在则返回null*/public static String getValue(String json, String path) throws JsonProcessingException {JsonNode node = mapper.readTree(json);String[] keys = path.split("\\.");for (String key : keys) {if (node == null || !node.has(key)) {return null;}node = node.get(key);}return node.asText();}/*** 修改JSON对象中的值** @param json JSON字符串* @param path 路径(如 "user.name")* @param value 新值* @return 修改后的JSON字符串*/public static String setValue(String json, String path, String value) throws JsonProcessingException {ObjectNode node = (ObjectNode) mapper.readTree(json);String[] keys = path.split("\\.");ObjectNode current = node;for (int i = 0; i < keys.length - 1; i++) {if (!current.has(keys[i])) {current.putObject(keys[i]);}current = (ObjectNode) current.get(keys[i]);}current.put(keys[keys.length - 1], value);return mapper.writeValueAsString(node);}/*** 合并两个JSON对象** @param json1 第一个JSON字符串* @param json2 第二个JSON字符串* @return 合并后的JSON字符串*/public static String merge(String json1, String json2) throws JsonProcessingException {ObjectNode node1 = (ObjectNode) mapper.readTree(json1);ObjectNode node2 = (ObjectNode) mapper.readTree(json2);node1.setAll(node2);return mapper.writeValueAsString(node1);}
}
3. 工具类的使用示例
示例1:美化JSON打印
public class JsonUtilsExample {public static void main(String[] args) throws JsonProcessingException {String json = "{\"name\":\"John\",\"age\":30,\"address\":{\"city\":\"New York\",\"zip\":\"10001\"}}";String prettyJson = JsonUtils.prettyPrint(json);System.out.println(prettyJson);}
}
输出:
{"name" : "John","age" : 30,"address" : {"city" : "New York","zip" : "10001"}
}
示例2:从JSON中提取数据
public class JsonUtilsExample {public static void main(String[] args) throws JsonProcessingException {String json = "{\"name\":\"John\",\"age\":30,\"address\":{\"city\":\"New York\",\"zip\":\"10001\"}}";String city = JsonUtils.getValue(json, "address.city");System.out.println("City: " + city); // 输出:City: New York}
}
示例3:修改JSON数据
public class JsonUtilsExample {public static void main(String[] args) throws JsonProcessingException {String json = "{\"name\":\"John\",\"age\":30,\"address\":{\"city\":\"New York\",\"zip\":\"10001\"}}";String updatedJson = JsonUtils.setValue(json, "address.city", "Los Angeles");System.out.println(updatedJson);}
}
输出:
{"name":"John","age":30,"address":{"city":"Los Angeles","zip":"10001"}}
示例4:合并JSON对象
public class JsonUtilsExample {public static void main(String[] args) throws JsonProcessingException {String json1 = "{\"name\":\"John\",\"age\":30}";String json2 = "{\"address\":{\"city\":\"New York\",\"zip\":\"10001\"}}";String mergedJson = JsonUtils.merge(json1, json2);System.out.println(mergedJson);}
}
输出:
{"name":"John","age":30,"address":{"city":"New York","zip":"10001"}}
4. 总结
通过实现JsonUtils工具类,我们可以轻松地优化JSON对象的打印和数据处理。该工具类提供了以下功能:
- 美化JSON打印:使JSON字符串更易读。
- 提取数据:通过路径从JSON对象中提取值。
- 修改数据:通过路径修改JSON对象中的值。
- 合并JSON对象:将多个JSON对象合并为一个。 这些功能可以显著提高开发效率,减少代码冗余。希望本文对您有所帮助!
注:该工具类只是一个简单的demo,具体工具类的使用需要根据开发者的实际需求进行改造升级!!!
相关文章:
JSON对象处理工具类
目录 1. 工具类的功能设计 2. 工具类的实现 依赖配置 工具类代码 3. 工具类的使用示例 示例1:美化JSON打印 示例2:从JSON中提取数据 示例3:修改JSON数据 示例4:合并JSON对象 4. 总结 在现代软件开发中,JSON&…...
通义万相 2.1 + 蓝耘算力,AI 视频生成的梦幻组合
在这个科技日新月异的时代,人工智能不断刷新着我们对世界的认知。一次偶然的机会,我借助北京蓝耘科技股份有限公司提供的算力支持,踏上了使用通义万相 2.1 进行 AI 视频生成的奇妙之旅。 目录 1.1初遇蓝耘科技: 1.2通义万相 2.1…...
汽车一键启动按钮更换注意事项
汽车一键启动开关更换教程 一键启动开关是现代汽车中常见的便捷配置,但随着时间的推移,这个部件可能会出现失灵的情况。当一键启动开关发生故障时,许多车主选择自行更换。以下是整理的一键启动开关更换教程: 更换前的准备 选择匹…...
AI系统架构
在AI系统架构中,通常可以分为基础设施层、模型层和应用层。它们分别对应不同的技术和应用场景,具体如下: 1. 基础设施层(Infrastructure Layer) 这是AI系统的底层支持,主要涉及计算资源、存储、网络等基础…...
DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14_01基础固定表头示例
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14_01基础固定表头…...
spring boot3.4.3+MybatisPlus3.5.5+swagger-ui2.7.0
使用 MyBatis-Plus 操作 books 表。我们将实现以下功能: 创建实体类 Book。 创建 Mapper 接口 BookMapper。 创建 Service 层 BookService 和 BookServiceImpl。 创建 Controller 层 BookController。 配置 MyBatis-Plus 和数据库连接。 1. 项目结构 src ├─…...
解决CentOS 8.5被恶意扫描的问题
CentOS 8 官方仓库已停止维护(EOL),导致一些常用依赖包如fail2ban 无法正常安装。 完整解决方案: 一、问题根源 CentOS 8 官方仓库已停更:2021 年底 CentOS 8 停止维护,默认仓库的包可能无法满足依赖关系。EPEL 仓库兼容性:EPEL 仓库可能未适配 CentOS 8.5 的旧版本依赖…...
laravel中 添加公共/通用 方法/函数
一,现在app 下面创建Common目录,然后在创建Common.php 文件 二,修改composer.json文件 添加这个到autoload 中 "files": ["app/Common/Common.php"]"autoload": {"psr-4": {"App\\": &quo…...
在vs中无法用QtDesigner打开ui文件的解决方法
解决方法 右键ui文件,选择打开方式,弹出如下界面。 点击添加,弹出如下界面 点击程序后边的三个点,去电脑查找designer.exe,我的位置为D:\Qt\Qt5.9.9\5.9.9\msvc2015_64\bin\designer.exe。 名称可以自己起一个名字,…...
springboot 文件下载
在springboot中,执行如下代码实现文件下载 GetMapping("/file/download/test")public void Download(HttpServletResponse response){try {String path "XXXXXXXXXXXX";//文件路径File file new File(path);// 读到流中InputStream inputStre…...
Nest.js全栈开发终极实践:TypeORM+微服务+Docker构建高可用企业级应用
文章目录 **第一部分:认识Nest.js与基础环境搭建****1.1 什么是Nest.js?****1.2 环境准备****1.3 创建第一个项目****1.4 启动开发服务器****1.5 核心文件解读** **第二部分:基础控制器与路由****2.1 控制器的作用****2.2 创建自定义控制器**…...
Go语言集成DeepSeek API和GoFly框架文本编辑器实现流式输出和对话(GoFly快速开发框架)
说明 本文是GoFly快速开发框架集成Go语言调用 DeepSeek API 插件,实现流式输出和对话功能。为了方便实现更多业务功能我们在Go服务端调用AI即DeepSeek接口,处理好业务后再用Gin框架实现流失流式输出到前端,前端使用fetch请求接收到流式的mar…...
Hexo博客Icarus主题不蒜子 UV、PV 统计数据初始化配置
文章首发于 不蒜子 UV、PV 统计数据初始化配置 适用场景 如果你有个运行的网站域名,采用了不蒜子统计 UV、PV等访客和阅读数据,但是有一天,你觉得想要换一个新的域名。当你将网站绑定到新的域名后,突然发现,所有的文章…...
在资源有限中逆势突围:从抗战智谋到寒门高考的破局智慧
目录 引言 一、历史中的非对称作战:从李牧到八路军的智谋传承 李牧戍边:古代军事博弈中的资源重构 八路军的游击战:现代战争中的智慧延续 二、创业界的逆袭之道:小米与拼多多的资源重构 从MVP到杠杆解 社交裂变与资源错配 …...
SQLAlchemy系列教程:如何执行原生SQL
Python中的数据库交互提供了高级API。但是,有时您可能需要执行原始SQL以提高效率或利用数据库特定的特性。本指南介绍在SQLAlchemy框架内执行原始SQL。 在SQLAlchemy中执行原生SQL SQLAlchemy虽然以其对象-关系映射(ORM)功能而闻名ÿ…...
绪论数据结构基本概念(刷题笔记)
(一)单选题 1.与数据元素本身的形式、相对位置和个数无关的是(B)【广东工业大学2019年829数据结构】 A.数据存储结构 B.数据逻辑结构 C.算法 D.操作 2.在数据结构的讨论中把数据结构从逻辑上分为(C)【中国…...
delphi 正则提取html中的内容
function ExtractTextFromHTML(const HTML: string): string; var RegEx: TRegEx; begin Result := HTML; // 移除<script>标签及其内容 Result := TRegEx.Replace(Result, <script.*?>.*?</script>, , [roIgnoreCase, roSingleLine]); // 移除<s…...
18天 - 常见的 HTTP 状态码有哪些?HTTP 请求包含哪些内容,请求头和请求体有哪些类型?HTTP 中 GET 和 POST 的区别是什么?
常见的 HTTP 状态码有哪些? HTTP 状态码用于指示服务器对客户端请求的响应结果,常见的 HTTP 状态码可以分为以下几类: 1. 信息类(1xx) 100 Continue:客户端应继续发送请求。101 Switching Protocols&…...
从0开始的操作系统手搓教程45——实现exec
目录 建立抽象 实现加载 实现sys_execv !!!提示:因为实现问题没有测试。所以更像是笔记! exec 函数的作用是用新的可执行文件替换当前进程的程序体。具体来说,exec 会将当前正在运行的用户进程的进程体&…...
Android TCP封装工具类
TCP通信的封装,我们可以从以下几个方面进行改进: 线程池优化:使用更高效的线程池配置,避免频繁创建和销毁线程。 连接重试机制:在网络不稳定时,自动重试连接。 心跳机制:保持长连接ÿ…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
