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

发布时间:2024年01月09日

一、概述

我们在 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-

文章来源:https://blog.csdn.net/qq_16127313/article/details/135481476
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。