相关文章推荐
强悍的太阳  ·  SINE: ...·  1 年前    · 
发呆的洋葱  ·  apache nifi - Using ...·  1 年前    · 
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 会发生错误

分类:
后端
标签: