基于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-

相关推荐
njsgcs19 小时前
json转excel python pd
python·json·excel·pd
代码搬运媛1 天前
【架构相关】tsconfig.json 与 tsconfig.node.json、tsconfig.app.json 的关系和作用
node.js·json
Lucky_Turtle2 天前
【Java Xml】dom4j写入XML
xml·java·python
莫陌尛.2 天前
xml方式bean的配置---实例化bean的方式
xml
aerror2 天前
json转excel xlsx文件
开发语言·python·json
掉鱼的猫3 天前
全球首个支持 IETF JSONPath (RFC 9535) 标准的 Java 框架,Snack4-Jsonpath v4.0.0 发布
java·json
六元七角八分3 天前
pom.xml
xml·数据库
吹个口哨写代码3 天前
处理文本编辑器存的json格式报错问题,对编辑器存的字段进行转换处理,再通过json返回
java·编辑器·json
APIshop3 天前
代码实例:Python 爬虫抓取与解析 JSON 数据
爬虫·python·json
得物技术4 天前
从 JSON 字符串到 Java 对象:Fastjson 1.2.83 全程解析|得物技术
java·后端·json