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