使用Jackson忽略JSON对象上的新字段
我正在使用Jackson JSON库将一些JSON对象转换为android应用程序上的POJO类。 问题是,JSON对象可能会改变,并且在应用程序发布的时候添加新的字段,但是现在当添加一个简单的string字段时,它将会被破坏,这可以被安全地忽略。
有没有办法告诉jackson忽略新增的领域? (例如在POJO对象上不存在)? 全球忽视将是伟大的。
Jackson提供了可以在类级别使用的注释( JsonIgnoreProperties )。
将以下内容添加到课程顶部( 而不是个别方法):
@JsonIgnoreProperties(ignoreUnknown = true) public class Foo { ... }
根据您使用的jackson版本,您将不得不在当前版本中使用不同的导入:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
在旧版本中,它一直是:
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
另外还有两个已经提到的机制,还有全局特性可以用来抑制所有由未知(未映射)属性引起的故障:
// 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);
这是缺less注释时使用的默认值,可以方便地回退。
与jackson2最新和完整的答案
使用注释
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @JsonIgnoreProperties(ignoreUnknown = true) public class MyMappingClass { }
请参阅Jackson在线文档上的JsonIgnoreProperties 。
使用configuration
比注解更less侵入。
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 。
如果使用基于JSON响应的pojo类。 如果有机会json变化经常在POJO级别声明:
@JsonIgnoreProperties(ignoreUnknown = true)
并在objectMapper添加这个,如果你正在转换:
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
这样代码不会中断。
请确保将@JsonIgnoreProperties(ignoreUnknown = true)
注释放置到您要填充的POJO类的父类,因为它parsing了JSON响应,而不是从JSON转换为Java对象的类。
如上所述,注释仅在父POJO类中指定时才有效,而不是从JSON转换为Java对象的类。
另一种方法是不用触及父类而造成中断,只需要为你需要的映射器方法实现你自己的映射器configuration。
此外,反序列化function的包已被移动。 DeserializationConfig.FAIL_ON_UNKNOWN_PROPERTIES到DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES
import org.codehaus.jackson.map.DeserializationConfig; ... objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
从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);
注意:基于@annotation的解决scheme保持不变,所以如果你喜欢使用,请参阅其他答案。
For more information see the 10 minutes Configuration tutorial at:
https For more information see the 10 minutes Configuration tutorial at:
//github.com/FasterXML/jackson-databind
它可以实现2种方式:
-
标记POJO忽略未知属性
@JsonIgnoreProperties(ignoreUnknown = true)
-
configurationObjectMapper序列化/反序列化POJO / json,如下所示:
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)
我正在使用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>
首先,如果你想忽略全局的未知属性,你可以configurationObjectMapper
。
如下所示:
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; } }
您可以使用@JsonIgnore在POJO中注释特定的属性。
- Spring REST服务:如何configuration删除json响应中的空对象
- jackson枚举序列化和DeSerializer
- 如何使用Jackson JSON将JSONstring转换为Map <String,String>
- jackson – 具有双向关系的实体序列化(避免循环)
- 在不知道JSON格式的情况下在Java中parsingJSON
- 我应该如何在我的RESTful JAX-RS Web服务中logging未捕获的exception?
- jackson-core-asl和jackson-core-lgpl有什么区别?
- 避免对未获取的惰性对象进行Jackson序列化
- 杰森JSON反序列化与根元素