我正在使用Jackson JSON库将一些JSON对象转换为android应用程序上的POJO类。问题是,JSON对象可能会发生变化,并在应用程序发布时添加了新的字段,但目前它将在添加简单的String字段时中断,可以安全地忽略它。
有没有办法告诉Jackson忽略新添加的字段?(例如在POJO对象上不存在)?全球无视会很好。
我正在使用Jackson JSON库将一些JSON对象转换为android应用程序上的POJO类。问题是,JSON对象可能会发生变化,并在应用程序发布时添加了新的字段,但目前它将在添加简单的String字段时中断,可以安全地忽略它。
有没有办法告诉Jackson忽略新添加的字段?(例如在POJO对象上不存在)?全球无视会很好。
当前回答
Jackson提供了一个可以在类级别上使用的注释(JsonIgnoreProperties)。
将以下内容添加到类的顶部(而不是单个方法):
@JsonIgnoreProperties(ignoreUnknown = true)
public class Foo {
...
}
根据你正在使用的jackson版本,你必须在当前版本中使用不同的导入:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
在较旧的版本中,它是:
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
其他回答
如果使用基于JSON响应的pojo类。如果有机会在pojo类级别频繁声明json更改:
@JsonIgnoreProperties(ignoreUnknown = true)
在objectMapper中,如果你正在转换,添加这个:
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
这样密码就不会被破解。
除了前面提到的2种机制外,还有一个全局特性可以用来抑制由未知(未映射)属性引起的所有故障:
// 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);
这是在没有注释的情况下使用的默认值,可以方便地进行回退。
对于使用Spring Boot的用户,您可以使用Jackson2ObjectMapperBuilder配置Jackson的默认行为。
例如:
@Bean
public Jackson2ObjectMapperBuilder configureObjectMapper() {
Jackson2ObjectMapperBuilder oMapper = new Jackson2ObjectMapperBuilder();
oMapper.failOnUnknownProperties(false);
return oMapper;
}
然后,您可以在任何需要它的地方自动装配ObjectMapper(默认情况下,这个对象映射器也将用于http内容转换)。
您可以使用@JsonIgnore在POJO中注释特定的属性。
如上所述,只有在父POJO类中指定,而不是在发生从JSON到Java Object转换的类中指定时,注释才有效。
另一种不涉及父类且不引起中断的方法是仅为所需的mapper方法实现自己的mapper配置。
反序列化特性的包也被移动了。 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);