文章目录
- 一、概述
- 二、思路
- 三、实现
- 四、测试
一、概述
我们在 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-