java - 使用Jackson忽略JSON对象上的新字段
这个问题在这里已有答案:
杰克逊与JSON:未被识别的领域,没有标记为可忽略 32个答案
我正在使用Jackson JSON库将一些JSON对象转换为Android应用程序上的POJO类。 问题是,JSON对象可能会更改并在应用程序发布时添加新字段,但是当添加一个简单的String字段时,它会崩溃,这可以安全地忽略。
有没有办法告诉杰克逊忽略新添加的字段? (例如,POJO对象上不存在)? 全球忽视将是伟大的。
12个解决方案
751 votes
Jackson提供了一个可以在类级别使用的注释(JsonIgnoreProperties)。
将以下内容添加到您的类的顶部(而不是单个方法):
@JsonIgnoreProperties(ignoreUnknown = true)
public class Foo {
...
}
根据您使用的jackson版本,您必须在当前版本中使用不同的导入:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
在旧版本中,它一直是:
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
Hadi Eskandari answered 2019-01-24T16:17:01Z
387 votes
此外,已经提到了两种机制,还有一个全局功能可用于抑制由未知(未映射)属性引起的所有故障:
// 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);
这是缺少注释时使用的默认值,可以方便地回退。
StaxMan answered 2019-01-24T16:17:30Z
95 votes
杰克逊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。
Yves M. answered 2019-01-24T16:18:27Z
56 votes
它可以通过2种方式实现:
标记POJO以忽略未知属性
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)
配置序列化/反序列化POJO / json的ObjectMapper,如下所示:
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)
Amit Kaneria answered 2019-01-24T16:18:58Z
24 votes
如果使用基于JSON响应的pojo类。 如果有可能json更改经常在pojo类级别声明:
@JsonIgnoreProperties(ignoreUnknown = true)
如果要转换,则在objectMapper中添加:
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
所以代码不会破坏。
user5636084 answered 2019-01-24T16:19:33Z
17 votes
确保将@JsonIgnoreProperties(ignoreUnknown = true)批注放置到要作为解析JSON响应的结果填充的父POJO类,而不是将JSON转换为Java对象的类。
Rushi Shah answered 2019-01-24T16:19:55Z
15 votes
从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);
注意:基于@注释的解决方案保持不变,因此如果您想使用它,请参阅其他答案。
For more information see the 10 minutes Configuration tutorial at: [https://github.com/FasterXML/jackson-databind]
Alboz answered 2019-01-24T16:20:38Z
10 votes
如上所述,注释仅在父POJO类中指定,而不是从JSON转换为Java Object的类时才有效。
另一种不触及父类并导致中断的替代方法是仅为您需要的映射器方法实现自己的映射器配置。
此外,已移动反序列化功能的包。DeserializationConfig.FAIL_ON_UNKNOWN_PROPERTIES toDeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES
import org.codehaus.jackson.map.DeserializationConfig;
...
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mekdev answered 2019-01-24T16:21:16Z
9 votes
@JsonIgnoreProperties(ignoreUnknown = true)对我来说效果很好。 我有一个运行在tomcat上的jdk 1.7的java应用程序。
Parul answered 2019-01-24T16:21:38Z
7 votes
我正在使用jackson-xxx 2.8.5.Maven Dependency,如:
com.fasterxml.jackson.core
jackson-core
2.8.5
com.fasterxml.jackson.core
jackson-annotations
2.8.5
com.fasterxml.jackson.core
jackson-databind
2.8.5
首先,如果要全局忽略未知属性,可以配置@JsonIgnoreProperties(ignoreUnknown = true)。
如下所示:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
如果你想忽略一些类,你可以在你的类上添加注释@JsonIgnoreProperties(ignoreUnknown = true),如:
@JsonIgnoreProperties(ignoreUnknown = true)
public class E1 {
private String t1;
public String getT1() {
return t1;
}
public void setT1(String t1) {
this.t1 = t1;
}
}
inOut answered 2019-01-24T16:22:21Z
0 votes
对于使用Spring Boot的用户,可以使用Jackson2ObjectMapperBuilder配置Jackson的默认行为。
例如 :
@Bean
public Jackson2ObjectMapperBuilder configureObjectMapper() {
Jackson2ObjectMapperBuilder oMapper = new Jackson2ObjectMapperBuilder();
oMapper.failOnUnknownProperties(false);
return oMapper;
}
然后,您可以在任何需要的地方自动装配ObjectMapper(默认情况下,此对象映射器也将用于http内容转换)。
Thoomas answered 2019-01-24T16:22:54Z
-2 votes
您可以使用@JsonIgnore在POJO中注释特定属性。
Prasanna answered 2019-01-24T16:23:17Z