使用Jackson忽略JSON对象上的新字段

我正在使用Jackson JSON库将一些JSON对象转换为android应用程序上的POJO类。问题是,JSON对象可能会在应用程序发布时更改并添加新字段,但目前添加简单的String字段时会收支平衡,可以安全地忽略。

有没有办法告诉Jackson忽略新添加的字段?(例如POJO对象上不存在的字段)?全局忽略会很棒。

642759 次浏览

Jackson提供了一个可以在类级别上使用的注释(JsonIgnoreProperties)。

将以下内容添加到类的顶部(没有到各个方法):

@JsonIgnoreProperties(ignoreUnknown = true)
public class Foo {
...
}

根据您使用的杰克逊版本,您必须在当前版本中使用不同的导入:

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

在旧版本中,它是:

import org.codehaus.jackson.annotate.JsonIgnoreProperties;

您可以使用@JsonIgnore在POJO中注释特定属性。

除了已经提到的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);

这是在没有注释的情况下使用的默认值,并且可以方便地回退。

确保将@JsonIgnoreProperties(ignoreUnknown = true)注释放置到要填充的父POJO类,这是解析JSON响应的结果,而不是正在进行从JSON到Java对象转换的类。

最新和完整的答案与杰克逊2


使用注释

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;


@JsonIgnoreProperties(ignoreUnknown = true)
public class MyMappingClass {


}

请参阅杰克逊在线留档上的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);

请参阅杰克逊在线留档上的FAIL_ON_UNKNOWN_PROPERTIES

如上所述,注释仅在父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);

如果使用基于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);

注意:基于@注解的解决方案保持不变,因此如果您喜欢使用该解决方案,请参阅其他答案。

For more information see the 10 minutes Configuration tutorial at:https://github.com/FasterXML/jackson-databind

我正在使用jackson-xxx 2.8.5。Maven Dependency喜欢:

<dependencies>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.5</version>
</dependency>


<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.5</version>
</dependency>


<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.5</version>
</dependency>


</dependencies>

首先,如果你想忽略未知属性globally.you可以配置ObjectMapper。 如下:

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;
}
}

它可以通过两种方式实现:

  1. 标记POJO以忽略未知属性

    @JsonIgnoreProperties(ignoreUnknown = true)
    
  2. Configure ObjectMapper that serializes/De-serializes the POJO/json as below:

    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) 对我来说工作得很好。我有一个Java应用程序,它在使用jdk 1.7的tomcat上运行。

对于使用Spring Boot的用户,您可以使用Jackson2ObjectMapperBuilder配置Jackson的默认行为。

例如:

@Bean
public Jackson2ObjectMapperBuilder configureObjectMapper() {
Jackson2ObjectMapperBuilder oMapper = new Jackson2ObjectMapperBuilder();
oMapper.failOnUnknownProperties(false);
return oMapper;
}

然后,您可以在任何需要的地方自动连接ObjectMapper(默认情况下,此对象映射器也将用于超文本传输协议内容转换)。