有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

有没有办法告诉Jackson忽略新添加的字段?(例如,POJO对象上不存在)?全球忽视将是一件好事


共 (6) 个答案

  1. # 1 楼答案

    @JsonIgnoreProperties(ignoreUnknown = true) 对我来说效果很好。我有一个java应用程序,它运行在带有JDK1.7的tomcat上

  2. # 2 楼答案

    可以通过两种方式实现:

    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) 
      
  3. # 3 楼答案

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

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

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

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

    import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
    

    在旧版本中,它是:

    import org.codehaus.jackson.annotate.JsonIgnoreProperties;
    
  4. # 4 楼答案

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

    @JsonIgnoreProperties(ignoreUnknown = true)
    

    如果要转换,请在objectMapper中添加以下内容:

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

    这样代码就不会被破坏

  5. # 5 楼答案

    Jackson 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

  6. # 6 楼答案

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

    // 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);
    

    这是在没有注释的情况下使用的默认值,可以作为方便的回退