文章目录
- 一、概述
- 二、思路
- 三、实现
- 四、测试
一、概述
我们在 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转换为需要的格式。
转换流程示意图如下:
三、实现
对照上面的分析,我们封装的方法如下:
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.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测试
*/
@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-