我正在使用Jackson JSON库将一些JSON对象转换为POJO类,在Android应用程序上。问题是,JSON对象可能会在应用程序发布时改变并添加新字段,但即使添加了一个简单的字符串字段(可以安全忽略)也会导致应用程序崩溃。
有没有办法告诉Jackson忽略新添加的字段?(例如, POJO对象中不存在的字段) 一个全局的忽略选项会很好。
Jackson提供了一个可以在类级别上使用的注释(JsonIgnoreProperties)。
在你的类顶部添加以下内容(而不是个别方法):
@JsonIgnoreProperties(ignoreUnknown = true)
public class Foo {
...
}
根据您使用的jackson版本,您需要使用不同的导入方式,当前版本为:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
在旧版本中,它是这样的:
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
除了已经提到的两种机制外,还有一种全局特性可用于抑制由未知(未映射)属性引起的所有失败:
// jackson 1.9 and before
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// or jackson 2.0
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
这是在缺少注释时使用的默认值,并且可以作为方便的后备选项。
ObjectMapper
。 - StaxMan使用Jackson 2获取最新的和完整的答案
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown = true)
public class MyMappingClass {
}
请参阅Jackson在线文档的JsonIgnoreProperties
比注释更少侵入性。
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectReader;
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
ObjectReader objectReader = objectMapper.reader(MyMappingClass.class);
MyMappingClass myMappingClass = objectReader.readValue(json);
请参阅Jackson在线文档中的FAIL_ON_UNKNOWN_PROPERTIES。
reader.without(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
配置 ObjectReader。 - fono这可以通过以下两种方式实现:
标记POJO以忽略未知属性
@JsonIgnoreProperties(ignoreUnknown = true)
配置ObjectMapper来序列化/反序列化POJO/json,如下所示:
ObjectMapper mapper =new ObjectMapper();
// for Jackson version 1.X
mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// for Jackson version 2.X
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
@JsonIgnoreProperties(ignoreUnknown = true)
对我非常有效。我有一个运行在JDK 1.7的Tomcat上的Java应用程序。
如果使用基于JSON响应的POJO类,如果有可能JSON经常发生更改,请在POJO类级别声明:
@JsonIgnoreProperties(ignoreUnknown = true)
如果你正在进行转换,则在objectMapper中添加以下内容:
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
这样代码就不会出现错误。
从Jackson 2.4版本开始,有一些变化。现在的做法是:
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
..........................................................................
ObjectMapper mapper = new ObjectMapper();
// to prevent exception when encountering unknown property:
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
确保将 @JsonIgnoreProperties(ignoreUnknown = true)
注解放置在要作为解析 JSON 响应结果的父级 POJO 类上,而不是在从JSON转换为Java对象的类中。
如上所述,仅当在父POJO类中指定而不是进行从JSON到Java对象的转换的类中指定时,注释才起作用。
另一种替代方法是,在不触及父类并引起干扰的情况下,为您需要的映射器方法实现自己的映射器配置。
此外,反序列化功能的包已被移动。 DeserializationConfig.FAIL_ON_UNKNOWN_PROPERTIES 变为 DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES。
import org.codehaus.jackson.map.DeserializationConfig;
...
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Jackson2ObjectMapperBuilder
来配置Jackson的默认行为。
例如:
@Bean
public Jackson2ObjectMapperBuilder configureObjectMapper() {
Jackson2ObjectMapperBuilder oMapper = new Jackson2ObjectMapperBuilder();
oMapper.failOnUnknownProperties(false);
return oMapper;
}
然后你可以在需要的任何地方自动装配ObjectMapper
(默认情况下,这个对象映射器也将用于HTTP内容转换)。
com.fasterxml.jackson.annotation.JsonIgnoreProperties
,但对我来说它不起作用。你有什么想法吗? - Nikscom.fasterxml.jackson.annotation.JsonIgnoreProperties
导入,它可以正常工作。 - Roger