当前位置: 首页 > news >正文

JSON对象处理工具类

目录

1. 工具类的功能设计

2. 工具类的实现

依赖配置

工具类代码

3. 工具类的使用示例

示例1:美化JSON打印

示例2:从JSON中提取数据

示例3:修改JSON数据

示例4:合并JSON对象

4. 总结

 在现代软件开发中,JSON(JavaScript Object Notation)是一种广泛使用的轻量级数据交换格式。由于其简洁性和易读性,JSON被广泛应用于API通信、配置文件、数据存储等场景。然而,在处理JSON数据时,我们常常会遇到以下问题:

  1. JSON打印不美观:默认的JSON字符串通常是紧凑的,不易阅读。
  2. 数据处理繁琐:从JSON中提取或修改数据时,代码冗长且容易出错。 为了解决这些问题,我们可以编写一个工具类,优化JSON对象的打印和数据处理。本文将详细介绍如何实现这样一个工具类,并提供示例代码。

1. 工具类的功能设计

我们的工具类JsonUtils将提供以下功能:

  1. 美化JSON打印:将JSON字符串格式化为易读的多行格式。
  2. 从JSON中提取数据:通过路径(如user.name)从JSON对象中提取值。
  3. 修改JSON数据:通过路径修改JSON对象中的值。
  4. 合并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对象的打印和数据处理。该工具类提供了以下功能:

  1. 美化JSON打印:使JSON字符串更易读。
  2. 提取数据:通过路径从JSON对象中提取值。
  3. 修改数据:通过路径修改JSON对象中的值。
  4. 合并JSON对象:将多个JSON对象合并为一个。 这些功能可以显著提高开发效率,减少代码冗余。希望本文对您有所帮助!

注:该工具类只是一个简单的demo,具体工具类的使用需要根据开发者的实际需求进行改造升级!!!

相关文章:

JSON对象处理工具类

目录 1. 工具类的功能设计 2. 工具类的实现 依赖配置 工具类代码 3. 工具类的使用示例 示例1&#xff1a;美化JSON打印 示例2&#xff1a;从JSON中提取数据 示例3&#xff1a;修改JSON数据 示例4&#xff1a;合并JSON对象 4. 总结 在现代软件开发中&#xff0c;JSON&…...

通义万相 2.1 + 蓝耘算力,AI 视频生成的梦幻组合

在这个科技日新月异的时代&#xff0c;人工智能不断刷新着我们对世界的认知。一次偶然的机会&#xff0c;我借助北京蓝耘科技股份有限公司提供的算力支持&#xff0c;踏上了使用通义万相 2.1 进行 AI 视频生成的奇妙之旅。 目录 1.1初遇蓝耘科技&#xff1a; 1.2通义万相 2.1…...

汽车一键启动按钮更换注意事项

汽车一键启动开关更换教程 一键启动开关是现代汽车中常见的便捷配置&#xff0c;但随着时间的推移&#xff0c;这个部件可能会出现失灵的情况。当一键启动开关发生故障时&#xff0c;许多车主选择自行更换。以下是整理的一键启动开关更换教程&#xff1a; 更换前的准备 选择匹…...

AI系统架构

在AI系统架构中&#xff0c;通常可以分为基础设施层、模型层和应用层。它们分别对应不同的技术和应用场景&#xff0c;具体如下&#xff1a; 1. 基础设施层&#xff08;Infrastructure Layer&#xff09; 这是AI系统的底层支持&#xff0c;主要涉及计算资源、存储、网络等基础…...

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14_01基础固定表头示例

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14_01基础固定表头…...

spring boot3.4.3+MybatisPlus3.5.5+swagger-ui2.7.0

使用 MyBatis-Plus 操作 books 表。我们将实现以下功能&#xff1a; 创建实体类 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中 添加公共/通用 方法/函数

一&#xff0c;现在app 下面创建Common目录&#xff0c;然后在创建Common.php 文件 二&#xff0c;修改composer.json文件 添加这个到autoload 中 "files": ["app/Common/Common.php"]"autoload": {"psr-4": {"App\\": &quo…...

在vs中无法用QtDesigner打开ui文件的解决方法

解决方法 右键ui文件&#xff0c;选择打开方式&#xff0c;弹出如下界面。 点击添加&#xff0c;弹出如下界面 点击程序后边的三个点&#xff0c;去电脑查找designer.exe,我的位置为D:\Qt\Qt5.9.9\5.9.9\msvc2015_64\bin\designer.exe。 名称可以自己起一个名字&#xff0c…...

springboot 文件下载

在springboot中&#xff0c;执行如下代码实现文件下载 GetMapping("/file/download/test")public void Download(HttpServletResponse response){try {String path "XXXXXXXXXXXX";//文件路径File file new File(path);// 读到流中InputStream inputStre…...

Nest.js全栈开发终极实践:TypeORM+微服务+Docker构建高可用企业级应用

文章目录 **第一部分&#xff1a;认识Nest.js与基础环境搭建****1.1 什么是Nest.js&#xff1f;****1.2 环境准备****1.3 创建第一个项目****1.4 启动开发服务器****1.5 核心文件解读** **第二部分&#xff1a;基础控制器与路由****2.1 控制器的作用****2.2 创建自定义控制器**…...

Go语言集成DeepSeek API和GoFly框架文本编辑器实现流式输出和对话(GoFly快速开发框架)

说明 本文是GoFly快速开发框架集成Go语言调用 DeepSeek API 插件&#xff0c;实现流式输出和对话功能。为了方便实现更多业务功能我们在Go服务端调用AI即DeepSeek接口&#xff0c;处理好业务后再用Gin框架实现流失流式输出到前端&#xff0c;前端使用fetch请求接收到流式的mar…...

Hexo博客Icarus主题不蒜子 UV、PV 统计数据初始化配置

文章首发于 不蒜子 UV、PV 统计数据初始化配置 适用场景 如果你有个运行的网站域名&#xff0c;采用了不蒜子统计 UV、PV等访客和阅读数据&#xff0c;但是有一天&#xff0c;你觉得想要换一个新的域名。当你将网站绑定到新的域名后&#xff0c;突然发现&#xff0c;所有的文章…...

在资源有限中逆势突围:从抗战智谋到寒门高考的破局智慧

目录 引言 一、历史中的非对称作战&#xff1a;从李牧到八路军的智谋传承 李牧戍边&#xff1a;古代军事博弈中的资源重构 八路军的游击战&#xff1a;现代战争中的智慧延续 二、创业界的逆袭之道&#xff1a;小米与拼多多的资源重构 从MVP到杠杆解 社交裂变与资源错配 …...

SQLAlchemy系列教程:如何执行原生SQL

Python中的数据库交互提供了高级API。但是&#xff0c;有时您可能需要执行原始SQL以提高效率或利用数据库特定的特性。本指南介绍在SQLAlchemy框架内执行原始SQL。 在SQLAlchemy中执行原生SQL SQLAlchemy虽然以其对象-关系映射&#xff08;ORM&#xff09;功能而闻名&#xff…...

绪论数据结构基本概念(刷题笔记)

&#xff08;一&#xff09;单选题 1.与数据元素本身的形式、相对位置和个数无关的是&#xff08;B&#xff09;【广东工业大学2019年829数据结构】 A.数据存储结构 B.数据逻辑结构 C.算法 D.操作 2.在数据结构的讨论中把数据结构从逻辑上分为&#xff08;C&#xff09;【中国…...

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 状态码有哪些&#xff1f; HTTP 状态码用于指示服务器对客户端请求的响应结果&#xff0c;常见的 HTTP 状态码可以分为以下几类&#xff1a; 1. 信息类&#xff08;1xx&#xff09; 100 Continue&#xff1a;客户端应继续发送请求。101 Switching Protocols&…...

从0开始的操作系统手搓教程45——实现exec

目录 建立抽象 实现加载 实现sys_execv &#xff01;&#xff01;&#xff01;提示&#xff1a;因为实现问题没有测试。所以更像是笔记&#xff01; exec 函数的作用是用新的可执行文件替换当前进程的程序体。具体来说&#xff0c;exec 会将当前正在运行的用户进程的进程体&…...

Android TCP封装工具类

TCP通信的封装&#xff0c;我们可以从以下几个方面进行改进&#xff1a; 线程池优化&#xff1a;使用更高效的线程池配置&#xff0c;避免频繁创建和销毁线程。 连接重试机制&#xff1a;在网络不稳定时&#xff0c;自动重试连接。 心跳机制&#xff1a;保持长连接&#xff…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…...