关于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相关的配置都在 DeserializationFeature
和 SerializationFeature
中,可以根据需要酌情配置。
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,这点使用时还是要区分一下。