关于Java:使用Jackson 忽略JSON对象上的新字段

Ignoring new fields on JSON objects using Jackson

本问题已经有最佳答案,请猛点这里访问。

我正在使用Jackson JSON库将一些JSON对象转换为Android应用程序上的POJO类。问题是,在发布应用程序时,JSON对象可能会更改并添加新的字段,但当前,即使添加了一个简单的字符串字段,它也会中断,这可以安全地忽略。

有没有办法告诉杰克逊忽略新添加的字段?(例如,POJO对象上不存在)?一个全球性的忽视是很好的。


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

将以下内容添加到类的顶部(而不是单个方法):

1
2
3
4
@JsonIgnoreProperties(ignoreUnknown = true)
public class Foo {
    ...
}

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

1
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

在旧版本中:

1
import org.codehaus.jackson.annotate.JsonIgnoreProperties;


除了前面提到的两种机制外,还可以使用全局功能来抑制由未知(未映射)属性导致的所有故障:

1
2
3
4
// 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);

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


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

使用注释

1
2
3
4
5
6
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public class MyMappingClass {

}

请参阅Jackson联机文档上的jsonignoreproperties。

使用配置

比注释更具侵入性。

1
2
3
4
5
6
7
8
9
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);

请参见杰克逊在线文档中的"关于未知属性的失败"。


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

  • 标记POJO以忽略未知属性

    1
    @JsonIgnoreProperties(ignoreUnknown = true)
  • 配置对pojo/json进行序列化/反序列化的objectmapper,如下所示:

    1
    2
    3
    4
    5
    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)

  • 如果使用基于JSON响应的POJO类。如果有可能JSON更改经常在POJO类级别声明:

    1
    @JsonIgnoreProperties(ignoreUnknown = true)

    如果要转换,请在对象映射器中添加:

    1
    objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    这样代码就不会被破坏。


    从杰克逊2.4版和更高版本开始,已经发生了一些变化。以下是您现在的做法:

    1
    2
    import com.fasterxml.jackson.databind.DeserializationFeature;
    import com.fasterxml.jackson.databind.ObjectMapper;

    …………………………………………………………

    1
    2
    3
     ObjectMapper mapper = new ObjectMapper();
        // to prevent exception when encountering unknown property:
     mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

    Note: The @annotation based solution remains the same so if you like to use that see the other answers.

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


    确保将EDOCX1 0的注释放置到父Pojo类中,这是为了解析JSON响应而不是填充的类,而不是从JSON到Java对象的转换发生的类。


    @JsonIgnoreProperties(ignoreUnknown = true)为我工作得很好。我有一个Java应用程序,它用JDK 1.7运行在Tomcat上。


    如上所述,注释只在父POJO类中指定,而不是从JSON到Java对象的转换发生的类中工作。

    另一种不接触父类并导致中断的方法是只为您需要的映射器方法实现您自己的映射器配置。

    此外,反序列化功能的包已被移动。反序列化config.fail_on_unknown_properties to反序列化config.feature.fail_on_unknown_properties

    1
    2
    3
    import org.codehaus.jackson.map.DeserializationConfig;
    ...
    objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    我在使用Jackson XXX 2.8.5.Maven依赖项,比如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <dependencies>
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            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>
            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>
            jackson-databind</artifactId>
            <version>2.8.5</version>
        </dependency>

    </dependencies>

    首先,如果要全局忽略未知属性,可以配置ObjectMapper。如下所示:

    1
    2
    3
    ObjectMapper objectMapper = new ObjectMapper();

    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    如果要忽略某些类,可以在类上添加注释@JsonIgnoreProperties(ignoreUnknown = true),如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class E1 {

        private String t1;

        public String getT1() {
            return t1;
        }

        public void setT1(String t1) {
            this.t1 = t1;
        }
    }

    对于使用Spring引导的用户,可以使用Jackson2ObjectMapperBuilder配置杰克逊的默认行为。

    例如:

    1
    2
    3
    4
    5
    6
    @Bean
    public Jackson2ObjectMapperBuilder configureObjectMapper() {
        Jackson2ObjectMapperBuilder oMapper = new Jackson2ObjectMapperBuilder();
        oMapper.failOnUnknownProperties(false);
        return oMapper;
    }

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


    您可以使用@jsonignore注释POJO中的特定属性。