转载

SpringBoot使用Jackson序列化Json和XML

关于Json库,最近讨论的最多是阿里开源的FastJson,虽然令人尴尬的是讨论的主要内容是其频繁暴露的安全漏洞问题。FastJson漏洞影响范围之大主要原因是在其在国内非常火爆,而在国外Jackson是主流选择,FastJson在国内热门的原因可能是因为作者是国人,版本更新频繁且中文资料较多,另外还有一个比较讨巧的原因是FastJson常用的方法都设置成静态方法,对于简单的序列化反序列化可以直接使用,不需要实例化,也不需要进行配置。而Jackson的所有操作都要依靠ObjectMapper这个对象来完成,在使用前都需要进行如下操作:

ObjectMapper mapper = new ObjectMapper();
mapper.xxxx
复制代码

前面说了这么多废话其实就是想说,对于新手来说Jackson使用起来还是稍微麻烦一点。

简单使用

Jackson是SpringBoot官方推荐的Json库,从SpringBoot1.2.0开始SpringBoot为其提供了自动配置,在 org.springframework.boot.autoconfigure.jackson 包下面可以看到Jackson的自动配置类 JacksonAutoConfiguration ,当配置文件中存在"spring.jackson"为前缀的配置后会向Spring容器注入一个ObjectMapper类型的Bean,如果开发时不需要特殊配置可以直接使用这个Bean:

@Autowired
private ObjectMapper objectMapper;
复制代码

自定义配置

Jackson提供了非常多的额外配置,可以满足各种不同的需求和场景,可以自己配置一个新的ObjectMapper类型的Bean,并设置相关的属性:

@Configuration
public class JSONConverterConfig {    
    @Bean(name = "objectMapper")    
    public ObjectMapper jacksonJsonMapper() {        
        ObjectMapper mapper = new ObjectMapper();        
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);       
        return mapper;   
        }
}
复制代码

上述代码就是配置了一个ObjectMapper的Bean,并且配置了属性 FAIL_ON_UNKNOWN_PROPERTIES ,对于Json中出现的未知属性不会抛出异常而是忽略。Jackson相关的配置都在 DeserializationFeatureSerializationFeature 中,可以根据需要酌情配置。

使用Jackson序列化XML

Jackson不仅仅是一个Json库,并且还是一个Xml库,这也可以从其包名 com.fasterxml.jackson 看出来。与Json使用相同,Jackson对于XML的操作都依赖于XmlMapper的实例化对象,XmlMapper是ObjectMapper的子类:

public class XmlMapper extends ObjectMapper {
    ...
}
复制代码

很可惜, org.springframework.boot.autoconfigure 并未提供XmlMapper的自动配置,需要我们手动定义一个配置类:

@Configuration
public class XmlConverterConfig {    
    @Bean(name = "xmlMapper")    
    public XmlMapper jacksonXmlMapper() {        
        XmlMapper mapper = new XmlMapper();        
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);        
        return mapper;    
        }
}
复制代码

由于XmlMapper和ObjectMapper的继承关系,如果仅仅配置了XmlMapper Bean,在程序中也是可以直接使用ObjectMapper的Bean进行操作,不过对象会被序列成XML而不是期望的Json,这点使用时还是要区分一下。

原文  https://juejin.im/post/5f03e0345188252e3a45d028
正文到此结束
Loading...