spring-boot Xml Json 数据解析

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 中声明了版本

        
            com.fasterxml.jackson.dataformat
            jackson-dataformat-xml
        

注册 ObjectMapperxmlMapper 到 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 data = Collections.singletonMap("name", "ldh");
  String json = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(data);
  System.out.println(json);

结果如下,内容是被格式化过的,方便阅读,因为调用了 writerWithDefaultPrettyPrinter()这个方法,

{
  "name" : "ldh"
}

使用 readValue() 的一系列重载的方法 解析json

 Map 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 data = Collections.singletonMap("name", "ldh");
 String xml = xmlMapper.writerWithDefaultPrettyPrinter().writeValueAsString(data);
 System.out.println(xml);

打印结构如下 , 格式经过 writerWithDefaultPrettyPrinter() 方法美化过,方便阅读


  ldh

解析xml数据

 Map xmlMap = xmlMapper.readValue("ldh", 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就可以做到 jsonxml 的解析。

你可能感兴趣的:(spring-boot Xml Json 数据解析)