SpringBoot使用Jackson序列化Json和XML

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

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:bash

@Autowired
private ObjectMapper objectMapper;
复制代码

自定义配置

Jackson提供了很是多的额外配置,能够知足各类不一样的需求和场景,能够本身配置一个新的ObjectMapper类型的Bean,并设置相关的属性:app

@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中,能够根据须要酌情配置。ui

使用Jackson序列化XML

Jackson不单单是一个Json库,而且仍是一个Xml库,这也能够从其包名com.fasterxml.jackson看出来。与Json使用相同,Jackson对于XML的操做都依赖于XmlMapper的实例化对象,XmlMapper是ObjectMapper的子类:spa

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

很惋惜,org.springframework.boot.autoconfigure并未提供XmlMapper的自动配置,须要咱们手动定义一个配置类:code

@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,这点使用时仍是要区分一下。xml