文章目录

  • 一、概述
  • 二、思路
  • 三、实现
  • 四、测试

一、概述

我们在 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转换为需要的格式。

转换流程示意图如下:

三、实现

对照上面的分析,我们封装的方法如下:
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);}}

四、测试

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测试 */@Slf4jpublic 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-