1. 介绍
解析 Json 的库有许多,例如 FASTjson, Jackson , spring mvc 默认使用 Jackson 解析Json 数据,如 在@RestController 标注的Controller 类返回的json 数据都是使用 Jackson
Jackson 也可以解析 xml ,但是在spring-boot 中需要额外的加入一个库
jackson-dataformat-xml
目的: 使用 jackson 来解析 json ,xml ,就不需要在去找其他库来做这个工作了,因为jackson 在 spring-boot 中自动配置了。
2. 开始
2.1 新建spring-boot项目
2.2 引入 jackson-dataformat-xml
用于解析 xml 数据,解析 json 的库不需要单独引入
version
坐标可以忽略,spring-boot 中声明了版本
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
注册 ObjectMapper
与 xmlMapper
到 spring 中, ObjectMapper 用于 json
的解析 xmlMapper 用于 xml
的解析
@Bean("xmlMapper")
public XmlMapper xmlMapper(Jackson2ObjectMapperBuilder builder){
return builder.createXmlMapper(true).build();
}
@Bean("objectMapper")
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
return builder.createXmlMapper(false).build();
}
2.3 json 解析 与 序列化
注入 ObjectMapper
@Autowired
@Qualifier("objectMapper")
private ObjectMapper objectMapper;
使用 writeValueAsString()
方法生成 json 文本
Map<String, String> data = Collections.singletonMap("name", "ldh");
String json = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(data);
System.out.println(json);
结果如下,内容是被格式化过的,方便阅读,因为调用了 writerWithDefaultPrettyPrinter()
这个方法,
{
"name" : "ldh"
}
使用 readValue()
的一系列重载的方法 解析json
Map<String,String> map = objectMapper.readValue("{\"name\" : \"ldh\"}", Map.class);
System.out.println(map);
打印结果如下
{name=ldh}
2.4 XML 的解析与序列化
注入 xmlMapper
对象
@Autowired
@Qualifier("xmlMapper")
private ObjectMapper xmlMapper;
调用 writeValueAsString()
方法生成xml数据
ObjectMapper xmlMapper = builder.createXmlMapper(true).build();
Map<String, String> data = Collections.singletonMap("name", "ldh");
String xml = xmlMapper.writerWithDefaultPrettyPrinter().writeValueAsString(data);
System.out.println(xml);
打印结构如下 , 格式经过 writerWithDefaultPrettyPrinter()
方法美化过,方便阅读
<SingletonMap>
<name>ldh</name>
</SingletonMap>
解析xml数据
Map xmlMap = xmlMapper.readValue("<SingletonMap><name>ldh</name></SingletonMap>", Map.class);
System.out.println(xmlMap);
打印结果为 {name=ldh}
, 具体的xml节点可以通过 jaxb 的一些注解来控制,如 @XmlRootElement
控制根节点名字
3. 总结
XmlMapper
是继承 ObjectMapper
类,而 ObjectMapper
默认行为是解析 json 数据,因为JacksonAutoConfiguration
中 默认注册的 是 json 解析
//spring-boot JacksonAutoConfiguration 自动配置类
@Bean
@Primary
@ConditionalOnMissingBean
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
return builder.createXmlMapper(false).build();
}
在本文中注册了两个相同类型的对象到 spring 中, 所以注入对象时需要配合 @Qualifier
注解来筛选 bean 对象,每次使用的时候只要注入对象,调用相关api就可以做到 json
与 xml
的解析。
网友评论