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

基于Jackson封装的JSON、Properties、XML、YAML 相互转换的通用方法

文章目录

  • 一、概述
  • 二、思路
  • 三、实现
  • 四、测试

一、概述

我们在 yaml转换成JSON、MAP、Properties 通过引入
在这里插入图片描述
实现了JSON、Properties、XML、YAML文件的相互转换,具体的类、方法如下:
在这里插入图片描述
上面的实现,定义了多个类、多个方法,使用太不方便,迫切需要精简逻辑。

二、思路

观察上面的代码实现,发现jackson对不同对象的封装主要是通过ObjectMapper的子类来进行的
在这里插入图片描述
以JsonUtils为例,观察方法的实现

/*** JsonUtils 转换工具* * @author 00fly**/
public class JsonUtils extends BaseJackson
{/*** json转properties字符串* * @param jsonText* @return* @throws IOException*/public static String jsonToPropText(String jsonText)throws IOException{JsonNode jsonNode = jsonMapper.readTree(jsonText);return javaPropsMapper.writeValueAsString(jsonNode);}/*** Json转xml字符串* * @param jsonText* @return* @throws IOException*/public static String jsonToXml(String jsonText)throws IOException{JsonNode jsonNode = jsonMapper.readTree(jsonText);return xmlMapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonNode);}/*** json转yaml* * @param jsonText* @return* @throws IOException*/public static String jsonToYaml(String jsonText)throws IOException{JsonNode jsonNode = jsonMapper.readTree(jsonText);return yamlMapper.writeValueAsString(jsonNode);}
}

我们发现,转换方法分为2步,首先将源格式数据转换为JsonNode,其次再将JsonNode转换为需要的格式。

转换流程示意图如下:

JSON
JsonNode
Properties对象
Properties字符串
XML
YAML
JSON
Properties对象
Properties字符串
XML
YAML

三、实现

对照上面的分析,我们封装的方法如下:
5个xxxToJsonNode 实现了原始数据到JsonNode的转换, 5个jsonNodeToxxx实现了JsonNode到结果数据的转换
在这里插入图片描述

核心代码:

 
import java.io.IOException;
import java.util.Properties;import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.fasterxml.jackson.dataformat.javaprop.JavaPropsMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;/*** JsonNodeUtils 转换工具* * @author 00fly**/
public class JsonNodeUtils
{private static JavaPropsMapper javaPropsMapper = new JavaPropsMapper();private static JsonMapper jsonMapper = new JsonMapper();private static XmlMapper xmlMapper = new XmlMapper();private static YAMLMapper yamlMapper = new YAMLMapper();// JsonNode对象转换为JSON、PROPERTIES、XML、YAML/*** jsonNode转json字符串* * @param jsonNode* @return*/public static String jsonNodeToJson(JsonNode jsonNode){return jsonNode.toPrettyString();}/*** jsonNode转properties字符串* * @param jsonNode* @return* @throws IOException*/public static String jsonNodeToPropsText(JsonNode jsonNode)throws IOException{return javaPropsMapper.writeValueAsString(jsonNode);}/*** jsonNode转properties对象* * @param jsonNode* @return* @throws IOException*/public static Properties jsonNodeToProperties(JsonNode jsonNode)throws IOException{return javaPropsMapper.writeValueAsProperties(jsonNode);}/*** jsonNode转xml字符串* * @param jsonNode* @return* @throws IOException*/public static String jsonNodeToXml(JsonNode jsonNode)throws IOException{return xmlMapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonNode);}/*** jsonNode转yaml* * @param jsonNode* @return* @throws IOException*/public static String jsonNodeToYaml(JsonNode jsonNode)throws IOException{return yamlMapper.writeValueAsString(jsonNode);}// JSON、PROPERTIES、XML、YAML转换为JsonNode对象/*** json转JsonNode* * @param jsonText* @return* @throws IOException*/public static JsonNode jsonToJsonNode(String jsonText)throws IOException{return jsonMapper.readTree(jsonText);}/*** properties对象转JsonNode* * @param properties* @return* @throws IOException*/public static JsonNode propsToJsonNode(Properties properties)throws IOException{return javaPropsMapper.readPropertiesAs(properties, JsonNode.class);}/*** properties字符串转JsonNode* * @param propText* @return* @throws IOException*/public static JsonNode propsToJsonNode(String propText)throws IOException{return javaPropsMapper.readTree(propText);}/*** xml转JsonNode* * @param xmlContent* @return* @throws IOException*/public static JsonNode xmlToJsonNode(String xmlContent)throws IOException{return xmlMapper.readTree(xmlContent);}/*** yaml转JsonNode* * @param yamlContent* @return* @throws IOException*/public static JsonNode yamlToJsonNode(String yamlContent)throws IOException{return yamlMapper.readTree(yamlContent);}
}

四、测试

下面的测试以json转换为propText、xml、yaml为例来说明,其他情况照猫画虎、以此类推, 能读代码的都是聪明人,哈哈!

import java.io.IOException;
import java.nio.charset.StandardCharsets;import org.apache.commons.io.IOUtils;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;import com.fly.core.utils.jackson.JsonNodeUtils;import lombok.extern.slf4j.Slf4j;/*** JsonNodeUtils测试*/
@Slf4j
public class JsonNodeUtilsTest
{static String jsonText;@BeforeAllpublic static void init(){try{Resource resource = new ClassPathResource("data.json");jsonText = IOUtils.toString(resource.getInputStream(), StandardCharsets.UTF_8);}catch (IOException e){log.error(e.getMessage(), e);}}@Testpublic void jsonToPropText()throws IOException{String propText = JsonNodeUtils.jsonNodeToPropsText(JsonNodeUtils.jsonToJsonNode(jsonText));log.info("jsonToPropText: {}", propText);}@Testpublic void jsonToXml()throws IOException{String xml = JsonNodeUtils.jsonNodeToXml(JsonNodeUtils.jsonToJsonNode(jsonText));log.info("jsonToXML: {}", xml);}@Testpublic void jsonToYaml()throws IOException{String yaml = JsonNodeUtils.jsonNodeToYaml(JsonNodeUtils.jsonToJsonNode(jsonText));log.info("jsonToYaml: {}", yaml);}
}

测试结果,就不放出来了。


大家可以根据需要选择方案,有任何问题和建议,都可以向我提问讨论,大家一起进步,谢谢!

-over-

相关文章:

基于Jackson封装的JSON、Properties、XML、YAML 相互转换的通用方法

文章目录 一、概述二、思路三、实现四、测试 一、概述 我们在 yaml转换成JSON、MAP、Properties 通过引入 实现了JSON、Properties、XML、YAML文件的相互转换,具体的类、方法如下: 上面的实现,定义了多个类、多个方法,使用太不…...

windows的换行符与linux风格的换行符不同的问题

问题展示: 说明: 出现这个错误的原因是脚本文件包含了windows风格换行符(‘\r\n’),而在linux环境下,通常使用unix风格的换行符(‘\n’).这个问题通常在windows环境下编辑脚本文件然…...

RK3568笔记九: DRM显示摄像头

若该文为原创文章,转载请注明原文出处。 一、介绍 学习DRM的目的是想做类似NVR显示多路实时流,通过勇哥(Marc)的指导,大概流程是通过Zlmedia拉流,RK3568的MPP解码,DRM显示,可以使用HDMI或DIS屏幕&#xf…...

简单明了,汽车级LM317系列LM317D2TR4G线性电压稳压器电源设计-参数应用方案分享

低压差线性稳压器(LDO),是指一种具有恒定电流输出电压的装置,主要由输入变压器、整流器、输出变压器三部分构成,工业原理为将输入的交流电压经过整流、滤波后得到直流输出电压,再经过控制元件和开关器件将稳…...

Flink会话集群docker-compose一键安装

1、安装docker 参考,本人这篇博客:https://blog.csdn.net/taotao_guiwang/article/details/135508643?spm1001.2014.3001.5501 2、flink-conf.yaml flink-conf.yaml放在/home/flink/conf/job、/home/flink/conf/task下面,flink-conf.yaml…...

qt.qpa.plugin: Could not find the Qt platform plugin “windows“ in ““

系统环境:Win10家庭中文版 Qt : 5.12.9 链接了一些64位的第三方库,程序编译完运行后出现 qt.qpa.plugin: Could not find the Qt platform plugin "windows" in "" 弹窗如下: 网上搜了一些都是关于pyQt的&#xff0c…...

vue面试题集锦

1. 谈一谈对 MVVM 的理解? MVVM 是 Model-View-ViewModel 的缩写。MVVM 是一种设计思想。 Model 层代表数据模型,也可以在 Model 中定义数据修改和操作的业务逻辑; View 代表 UI 组件,它负责将数据模型转化成 UI 展现出来,View 是…...

2024年学鸿蒙开发就业前景怎么样?

随着科技的不断进步,鸿蒙系统作为华为自主研发的操作系统,逐渐引起了人们的关注。 2024年,鸿蒙开发就业前景如何? 对于那些对鸿蒙开发感兴趣并希望在这一领域寻找职业发展的人来说,这是一个非常重要的问题。 首先&a…...

Unity网络通讯学习

---部分截图来自 siki学院Unity网络通讯课程 Socket 网络上的两个程序通过一个双向的通信连接实现数据交换,这个连接的一端称为一个 Socket ,Socket 包含了网络通信必须的五种信息 Socket 例子{ 协议: TCP 本地: IP &#xff…...

js入口函数和jQuery入口函数的区别

JS入口函数指的是JavaScript中的主入口函数&#xff0c;用来初始化页面加载完成后的操作。通常情况下&#xff0c;JS入口函数是在HTML页面中的<script>标签中定义的&#xff0c;通过onload事件等方式触发调用。 jQuery入口函数则是指使用jQuery库时的主入口函数&#xf…...

Docker-Compose编排Nginx1.25.1+PHP7.4.33+Redis7.0.11环境

实践说明&#xff1a;基于RHEL7(CentOS7.9)部署docker环境(23.0.1、24.0.2)&#xff0c;编排也可应用于RHEL7-9(如AlmaLinux9.1)&#xff0c;但因为docker的特性&#xff0c;适用场景是不限于此的。 文档形成时期&#xff1a;2017-2023年 因系统或软件版本不同&#xff0c;构建…...

《新课程教学》(电子版)是正规期刊吗?能评职称吗?

《新课程教学》&#xff08;电子版&#xff09;主要出版内容为学科教学理论、学科教学实践经验和成果&#xff0c;主要读者对象为中小学教师&#xff0c;期刊设卷首语、名家讲堂、课程与教学、教学实践、考试评价、教育信息化、教学琐谈、教育管理、教师心语、一线课堂、重温经…...

Posgresql macOS安装和基础操作

摘要 本文介绍macOS版本Postgresql的安装&#xff0c;pg常用命令。作为笔记记录&#xff0c;后续方便查看。 Postgresql安装 官网下载postgresql安装包https://www.postgresql.org/download/。官网下载慢时&#xff0c;可以从这里下载我上传的mac版本的pg安装包资源。下载后&am…...

ArkUI-X跨平台已至,何需其它!

运行环境 DevEco Studio&#xff1a;4.0Release OpenHarmony SDK API10 开发板&#xff1a;润和DAYU200 自从写了一篇ArkUI-X跨平台的文章之后&#xff0c;好多人都说对这个项目十分关注。 那么今天我们就来完整的梳理一下这个项目。 1、ArkUI-X 我们之前可能更多接触的…...

(2024,分数蒸馏抽样,Delta 降噪分数,LoRA)PALP:文本到图像模型的提示对齐个性化

PALP: Prompt Aligned Personalization of Text-to-Image Models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 4. 提示对齐方法 4.1 概述 4.2 个性化 4.3 提示对齐分数抽…...

近日遇到数据库及其他问题

一、查找备份表和原表不一样数据 select * from A where (select count(1) from A_BAK where A.IDA_BAK.ID) 0 二、在数据量比较大的表中新增有默认值的列速度较慢问题 使用 以下语句&#xff0c;在上亿数据的表中执行速度较慢 alter table TEST add col_a integer DEFA…...

【conda】conda 版本控制和环境迁移/安装conda加速工具mamba /conda常用指令/Anaconda配置

【conda】安装conda加速工具mamba /conda常用指令/Anaconda配置 0. conda 版本控制和环境迁移1. 安装conda加速工具mamba2. conda install version3. [Anaconda 镜像](https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/)使用帮助4. error deal 0. conda 版本控制和环境迁移…...

“/bin/bash“: stat /bin/bash: no such file or directory: unknown

简介&#xff1a;常规情况下&#xff0c;在进入容器时习惯使用 /bin/bash为结尾&#xff0c;如&#xff1a;docker exec -it test-sanic /bin/bash&#xff0c; 但是如果容器本身使用了精简版&#xff0c;只装了sh命令&#xff0c;未安装bash。这时就会抛出"/bin/bash&quo…...

基于Spring Boot+vue的云上新鲜水果超市商城系统

本云上水果超市是为了提高用户查阅信息的效率和管理人员管理信息的工作效率&#xff0c;可以快速存储大量数据&#xff0c;还有信息检索功能&#xff0c;这大大的满足了用户、员工信息和管理员这三者的需求。操作简单易懂&#xff0c;合理分析各个模块的功能&#xff0c;尽可能…...

vue-ESlint代码规范及修复

1. 介绍 ESLint:是一个代码检查工具&#xff0c;用来检查你的代码是否符合指定的规则(你和你的团队可以自行约定一套规则)。 在创建项目时&#xff0c;我们使用的是 JavaScript Standard Style 代码风格的规则。 规范网址&#xff1a;https://standardjs.com/rules-zhcn.htm…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...