1. 介绍
解析 Json 的库有许多,例如 FASTjson, Jackson , spring mvc 默认使用 Jackson 解析Json 数据,如 在@RestController 标注的Controller 类返回的json 数据都是使用 Jackson
Jackson 也可以解析 xml ,但是在spring-boot 中需要额外的加入一个库
jackson-dataformat-xml
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>
2.3 json 解析 与 序列化
注入 ObjectMapper
@Autowired
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 的解析与序列化
Jackson 的 ObjectMapper
默认是解析 json 数据,所以需要创建另外一个 ObjectMapper
对象
注入 Jackson2ObjectMapperBuilder
对象,使用 构建者模式来创造 ObjectMapper
@Autowired
private Jackson2ObjectMapperBuilder builder;
调用 build()
方法创建 ObjectMapper
对象 并且生成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 解析
@Bean
@Primary
@ConditionalOnMissingBean
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
return builder.createXmlMapper(false).build();
所以不能把 XmlMapper
对象注册到 spring 容器里,一旦将注册的话,注入 ObjectMapper
会发生错误