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

文章目录

一、概述

我们在 yaml转换成JSON、MAP、Properties 通过引入

实现了JSON、Properties、XML、YAML文件的相互转换,具体封装的类、方法如下:

上面的实现,定义了多个类、多个方法,使用不太方便,迫切需要精简逻辑。

二、思路

观察上面的代码实现,我们发现jackson对不同对象的封装主要是通过ObjectMapper的子类来达成的

以JsonUtils为例,观察方法的实现

java 复制代码
/**
 * 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转换为需要的格式。

转换流程示意图如下:
JSON JsonNode Properties对象 Properties字符串 XML YAML JSON Properties对象 Properties字符串 XML YAML

三、实现

对照上面的分析,我们封装的方法如下:
5个xxxToJsonNode 实现了原始数据到JsonNode的转换, 5个jsonNodeToxxx实现了JsonNode到结果数据的转换

核心代码:

java 复制代码
 
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.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);
    }
}

四、测试

java 复制代码
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.jsonNodeToPropsText(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-

相关推荐
泡海椒4 小时前
JQuick-SQL JQuickTable 模型:XML 动态 SQL 的表封装边界
xml·数据库·sql
supabc12314 小时前
欧盟电子发票(XRechnung/Peppol/ZUGFeRD)踩坑记:用 Python 不装 Java 跑官方校验规则
xml·python·开源·电子发票·1024程序员节
zzu123zsw1 天前
当 GPU 加速渲染遇上无头组件:拆解 Yororen UI 在 GPUI 生态下的状态解耦与 XML 模板实践
xml·ui·rust·gui·gpui
紧跟先前的步伐2 天前
Go AI Agent 实战 11|请求结构、响应结构与 JSON 解析
人工智能·ai·golang·json
麦序子2 天前
用 pdfplumber + 正则 解析工程量清单 PDF:提取项目编码、综合单价并导出 Excel
xml·pdf·python3.11
骑着蜗牛撵大象3272 天前
用 Codex 批量做数字人商品口播视频:从分镜 JSON 到成片校验的流水线
java·ffmpeg·json·音视频·数字人·视频·codex
外收内放2 天前
FastAPI猜字谜实战(3):把每一局存成JSON
开发语言·python·学习·json·fastapi
一只旭宝2 天前
JSON 简介
json
数据狐(Datafox)3 天前
一文读懂京东商品详情API:返回字段解读与 JSON 样例
java·开发语言·数据库·windows·json
喜欢喝果茶.3 天前
JSON / CBOR / Protobuf区别
mqtt·json