基于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.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转换为需要的格式。

将数据格式整理,转换成JsonNode原始格式和结果格式如下:

JSON
JsonNode
Properties
XML
YAML
JSON
Properties
XML
YAML

三、实现

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


import java.io.IOException;

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 jsonNodeToProps(JsonNode jsonNode)
        throws IOException
    {
        return javaPropsMapper.writeValueAsString(jsonNode);
    }
    
    /**
     * jsonNode转xml字符串
     * 
     * @param jsonNode
     * @return
     * @throws IOException
     */
    public static String jsonNodeToXml(JsonNode jsonNode)
        throws IOException
    {
        return xmlMapper.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 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);
    }
}

四、测试

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;
    
    @BeforeAll
    public 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);
        }
    }
    
    @Test
    public void jsonToPropText()
        throws IOException
    {
        String propText = JsonNodeUtils.jsonNodeToProps(JsonNodeUtils.jsonToJsonNode(jsonText));
        log.info("jsonToPropText: {}", propText);
    }
    
    @Test
    public void jsonToXml()
        throws IOException
    {
        String xml = JsonNodeUtils.jsonNodeToXml(JsonNodeUtils.jsonToJsonNode(jsonText));
        log.info("jsonToXML: {}", xml);
    }
    
    @Test
    public void jsonToYaml()
        throws IOException
    {
        String yaml = JsonNodeUtils.jsonNodeToYaml(JsonNodeUtils.jsonToJsonNode(jsonText));
        log.info("jsonToYaml: {}", yaml);
    }
}

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


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

-over-

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

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

相关文章

成功解决使用git clone下载失败的问题: fatal: 过早的文件结束符(EOF) fatal: index-pack 失败

一.使用 http 可能出现的问题和解决 1.问题描述 ~$ git clone https://github.com/oKermorgant/ecn_baxter_vs.git 正克隆到 ecn_baxter_vs... remote: Enumerating objects: 13, done. remote: Counting objects: 100% (13/13), done. remote: Compressing objects: 100% (…

ADS1110负电压采集

先说结论: 无法采集绝对的负电压(供电电压范围之外)。 ADS1110 16位AD转换问题 ads1110负电压采集 ADS1110是差分输入形式 在数据手册上有一个参数 模拟输入端VIN 的输入电压 最大是VDD0.2 最小是GND-0.2 模拟输入端VIN- 的输入也是这样…

【轮式移动机器人课程笔记 5】运动学仿真

L5 运动学仿真 本节重点: 如何理解推导出的运动学模型 回顾:机器人运动学模型 正向(前向)运动学模型反向运动学模型 基于MatLab运动学仿真 本节重点,如何利用matlab对运动学进行仿真 5.1 回顾运动学模型 [ x ˙ y …

Postman工具初学一篇快速入门教程

文章目录 下载安装注册登录CollectionFolderRequestGet请求Post请求Header设置Response响应 EnvironmentsGlobal环境变量其他环境变量Collection变量变量使用同名变量的优先级 Postman内置变量Pre-request script和Test script脚本设置、删除和获取变量获取请求参数获取响应数据…

重新认识canvas,掌握必要的联结密码

查看专栏目录 canvas示例教程100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

蓝桥杯 python 第二题 数列排序

这里给出一种解法 """ # 错的 n int(input()) dp[int(i) for i in input().split(" ")] dp.sort() print(" ".join(str(i) for i in dp)) """#这个是对的 num int(input())l list(map(int, input().split()))l.sort()pr…

Nginx配置jks格式证书,升级https

通常在给服务器升级https,需要在nginx上配置域名对应的https证书,nginx通常配置的是crt和key格式的证书。最近遇到有人提供了jks格式的证书,查阅了几个资料都是需要先将jks转为p12格式,然后再将p12转为crt格式。这里记录一下相关过…

JDK21和 Flowable 7.0.0

JDK21和 Flowable 7.0.0 一.Flowable二.项目搭建1.依赖包2.数据库3.资源文件1.YML配置文件2.Drools kbase3.Drools rule4.DMN 决策表5.BPMN 流文件 4.BPMN 流程图绘制插件5.测试代码1.启动类2.Flowable 配置3.Camel 配置1.Camel 配置2.Camel Router 定义 4.扩展类监听1.外部工作…

SpringBoot 创建定时任务(配合数据库动态执行)

相关参考文件如下: SpringBoot 创建定时任务(配合数据库动态执行) - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/88875287

css如何让两个元素在同一水平线上(文字和svg图片)

一开始写发现这两者不在同一水平线 起初用margin-top margin-bottom来协调 发现效果并不好 1:写法僵硬 2:margin会把div撑破,达不到预期效果(padding也是) 3. 加了flex布局 之后, 因为我这个是在表格里面,无法居中…

RK3568平台开发系列讲解(Linux系统篇)/dev/mem 物理内存映射到用户态

🚀返回专栏总目录 文章目录 一、/dev/mem 配置二、/dev/mem 设备的使用方法三、mmap 函数沉淀、分享、成长,让自己和他人都能有所收获!😄 一、/dev/mem 配置 /dev/mem 是 Linux 系统中的一个虚拟设备,通常与 mmap 结合使用,可以将设备的物理内存映射到用户态,以实现用…

QT DAY2 作业

1. 头文件 #ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget> #include <QMovie> #include <QTextEdit> #include <QDebug> namespace Ui { class MyWidget; }class MyWidget : public QWidget {Q_OBJECTpublic:explicit MyWidget(QWidget *p…

2024 Midjourney 基础教程(⼆):了解 Midjourney Bot 和AI绘画使用技巧进阶教学

在上⼀篇⽂章中&#xff0c;我们学到了如何注册 Midjourney &#xff0c;开通付费订阅&#xff0c;并画出了可能是⾃⼰的第⼀张 AI绘画。怎么样&#xff1f;这种将想象的画⾯&#xff0c;变为现实世界图⽚的感觉。 是否有种造物者的错觉&#xff0c;同时有种开盲盒的惊喜感&…

20230403读书笔记|《苏轼词集》——试问岭南应不好,此心安处是吾乡

20230403读书笔记|《苏轼词集》——试问岭南应不好&#xff0c;此心安处是吾乡 导读卷一卷二卷三 在书架里加了好几本苏轼词集&#xff0c;很多词是重复的&#xff0c;但这并不影响多读几本&#xff0c;苏轼的词豪迈大气&#xff0c;豁达爽朗&#xff0c;蛮值得一读的。有不少都…

图解Kubernetes的服务(Service)

pod 准备&#xff1a; 不要直接使用和管理Pods&#xff1a; 当使用ReplicaSet水平扩展scale时&#xff0c;Pods可能被terminated当使用Deployment时&#xff0c;去更新Docker Image Version&#xff0c;旧Pods会被terminated&#xff0c;然后创建新Pods 0 啥是服务&#xf…

【LeetCode:200. 岛屿数量 | DFS 】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Low Poly Cartoon House Interiors

400个独特的低多边形预制件的集合,可以轻松创建高质量的室内场景。所有模型都已准备好放入场景中,并使用一个纹理创建,以提高性能!包含演示场景! 模型分类: - 墙壁(79件) - 地板(28块) - 浴室(33个) - 厨房(36件) - 厨房道具(68件) - 房间道具(85件) - 灯具(…

Git LFS 大文件存储

Git 碰到大文件的困境 Git 是业界流行的分布式版本控制工具&#xff0c;本地仓库与远端仓库同样保存了全量的文件和变更历史&#xff0c;这样让代码协作变得简单和高效。但也正因为如此&#xff0c;Git针对大型文件&#xff08;例如图片、视频或其他二进制文件&#xff09;的版…

浅谈智慧路灯安全智能供电方案设计——安科瑞赵嘉敏

摘要: 智慧路灯&#xff0c;作为智慧城市、新基建、城市更新的主要组成部分&#xff0c;近些年在各大城市已得到很好的落地和 应用&#xff0c;但其与传统路灯相比集成大量异元异构电子设备&#xff0c;这些设备的供电电压、接口形式、权属单位各不相同&#xff0c; 如何设计一…

网络高清视频监控平台的告警联动(或报警联动)功能介绍

一、告警联动的定义和概念 视频监控领域的告警联动功能是指通过视频监控平台&#xff0c;将多个相关系统或设备进行集成&#xff0c;实现统一管理和自动化控制。当监控场景中出现异常情况时&#xff0c;系统能够自动触发相应的报警和响应&#xff0c;以保障安全和及时处理异常事…