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

Had*_*ari 592 java json jackson

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

有没有办法告诉杰克逊忽略新添加的字段?(例如,POJO对象上不存在)?全球忽视将是伟大的.

Had*_*ari 841

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

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

@JsonIgnoreProperties(ignoreUnknown = true)
public class Foo {
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
Run Code Online (Sandbox Code Playgroud)

在旧版本中,它一直是:

import org.codehaus.jackson.annotate.JsonIgnoreProperties;
Run Code Online (Sandbox Code Playgroud)

  • 在ObjectMapper级别上有什么办法吗?我无法编辑我正在反序列化的类.许多人使用它,他们在反序列化期间需要这些字段,但我不这样做.这些字段是已知属性. (12认同)
  • 如何用ObjectMapper做到这一点? (7认同)
  • 试图让这个工作在Jackson 2.x libs上.这个包现在改为`com.fasterxml.jackson.annotation.JsonIgnoreProperties`并且它不是为我工作.有什么想法吗? (3认同)

Sta*_*Man 434

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

// 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);
Run Code Online (Sandbox Code Playgroud)

这是缺少注释时使用的默认值,可以方便地回退.

  • 请注意,Spring> = 4.1.1会自动将此设置为false,恕不另行通知... https://jira.spring.io/browse/SPR-11891 (6认同)
  • 为什么这个配置对我没有影响?杰克逊2.6.4或2.7.0版 (3认同)
  • @zhaozhi 这些设置已经存在很长时间了,所以尽管你确实应该升级到分支的最新补丁(2.6.7、2.7.9),但这可能不是原因。最常见的原因是您使用的框架没有使用您正在配置的“ObjectMapper”。 (2认同)
  • 我不敢苟同,但如果字段更改名称,这将默默失败,除非我们逐个字段检查,否则我们不知道发生了什么。就我而言,它甚至**忽略 DTO 缺少任何字段定义时的失败**,这是非常危险的。所以无论是什么类型的失败都会被忽略;谨慎使用。 (2认同)

Yve*_* M. 113

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


使用注释

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public class MyMappingClass {

}
Run Code Online (Sandbox Code Playgroud)

请参阅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);
Run Code Online (Sandbox Code Playgroud)

请参阅Jackson在线文档中的FAIL_ON_UNKNOWN_PROPERTIES.

  • 如果一个人无法编辑MappingClass以添加注释,这个答案也非常有用 (7认同)
  • 您还可以使用`reader.without(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)直接配置ObjectReader. (2认同)

Ana*_*ika 79

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

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

    @JsonIgnoreProperties(ignoreUnknown = true)
    
    Run Code Online (Sandbox Code Playgroud)
  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) 
    
    Run Code Online (Sandbox Code Playgroud)


小智 26

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

@JsonIgnoreProperties(ignoreUnknown = true)
Run Code Online (Sandbox Code Playgroud)

如果要转换,则在objectMapper中添加:

objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Run Code Online (Sandbox Code Playgroud)

所以代码不会破坏.


小智 24

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


Alb*_*boz 18

从Jackson 2.4及更高版本开始,有一些变化.以下是您现在的工作方式:

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
Run Code Online (Sandbox Code Playgroud)

.................................................. ........................

 ObjectMapper mapper = new ObjectMapper();
    // to prevent exception when encountering unknown property:
 mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
Run Code Online (Sandbox Code Playgroud)

注意:基于@注释的解决方案保持不变,因此如果您想使用它,请参阅其他答案.

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


Rus*_*hah 17

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


mek*_*dev 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);
Run Code Online (Sandbox Code Playgroud)


Tho*_*mas 8

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

例如 :

@Bean
public Jackson2ObjectMapperBuilder configureObjectMapper() {
    Jackson2ObjectMapperBuilder oMapper = new Jackson2ObjectMapperBuilder();
    oMapper.failOnUnknownProperties(false);
    return oMapper;
}
Run Code Online (Sandbox Code Playgroud)

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


inO*_*Out 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>
Run Code Online (Sandbox Code Playgroud)

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

ObjectMapper objectMapper = new ObjectMapper();

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Run Code Online (Sandbox Code Playgroud)

如果要忽略某个类,可以@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;
    }
}
Run Code Online (Sandbox Code Playgroud)