美文网首页
spring-boot Xml Json 数据解析

spring-boot Xml Json 数据解析

作者: 晴了个天呀 | 来源:发表于2019-07-12 15:36 被阅读0次
    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>
    

    注册 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<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就可以做到 jsonxml 的解析。

    相关文章

      网友评论

          本文标题:spring-boot Xml Json 数据解析

          本文链接:https://www.haomeiwen.com/subject/iznekctx.html