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

有没有办法告诉Jackson忽略新添加的字段?(例如在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);

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

其他回答

我使用的是jackson-xxx 2.8.5。Maven依赖关系:

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

首先,如果你想忽略全局的未知属性。您可以配置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;
    }
}

可以通过两种方式实现:

将POJO标记为忽略未知属性 @JsonIgnoreProperties(ignoreUnknown = true) 配置ObjectMapper序列化/反序列化POJO/json,如下所示: ObjectMapper mapper =new ObjectMapper(); // Jackson版本1。X mapper.configure (DeserializationConfig.Feature。FAIL_ON_UNKNOWN_PROPERTIES、假); // Jackson版本2。X mapper.configure (DeserializationFeature。FAIL_ON_UNKNOWN_PROPERTIES假)

@JsonIgnoreProperties(ignoreUnknown = true) 对我来说很管用。我有一个运行在tomcat上的java应用程序,使用jdk 1.7。

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

最新和完整的回答与杰克逊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。