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

时间:2011-03-28 05:26:17

标签: java json jackson

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

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

12 个答案:

答案 0 :(得分:796)

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

将以下内容添加到班级的顶部(到单个方法):

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

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

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

在旧版本中它是:

import org.codehaus.jackson.annotate.JsonIgnoreProperties;

答案 1 :(得分:415)

此外,已经提到了两种机制,还有一个全局功能可用于抑制由未知(未映射)属性引起的所有故障:

// 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 :(得分:108)

杰克逊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

答案 3 :(得分:73)

可以通过两种方式实现:

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

    @JsonIgnoreProperties(ignoreUnknown = true)
    
  2. 配置用于序列化/反序列化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) 
    

答案 4 :(得分:26)

如果使用基于JSON响应的pojo类。如果json更改的频率很高,则会在pojo类级别声明:

@JsonIgnoreProperties(ignoreUnknown = true)

并在objectMapper中添加此项,如果您要转换:

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

因此代码不会中断。

答案 5 :(得分:18)

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

答案 6 :(得分:17)

确保将@JsonIgnoreProperties(ignoreUnknown = true)注释放置到要作为解析JSON响应的结果填充的父POJO类,而不是将JSON转换为Java Object的类。< / p>

答案 7 :(得分:17)

从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

答案 8 :(得分:11)

如上所述,注释仅在父POJO类中指定,而不是从JSON转换为Java Object的类时才有效。

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

此外,已移动反序列化功能的包。 DeserializationConfig.FAIL_ON_UNKNOWN_PROPERTIES to DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES

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

答案 9 :(得分:7)

我正在使用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>

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

答案 10 :(得分:5)

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

例如:

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

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

答案 11 :(得分:-1)

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