java在json的时候忽略_java - 使用Jackson忽略JSON对象上的新字段

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

这个问题在这里已有答案:

杰克逊与JSON:未被识别的领域,没有标记为可忽略                                     32个答案

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

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

12个解决方案

751 votes

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

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

@JsonIgnoreProperties(ignoreUnknown = true)

public class Foo {

...

}

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

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

在旧版本中,它一直是:

import org.codehaus.jackson.annotate.JsonIgnoreProperties;

Hadi Eskandari answered 2019-01-24T16:17:01Z

387 votes

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

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

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

StaxMan answered 2019-01-24T16:17:30Z

95 votes

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

Yves M. answered 2019-01-24T16:18:27Z

56 votes

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

标记POJO以忽略未知属性

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)

配置序列化/反序列化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)

Amit Kaneria answered 2019-01-24T16:18:58Z

24 votes

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

@JsonIgnoreProperties(ignoreUnknown = true)

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

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

所以代码不会破坏。

user5636084 answered 2019-01-24T16:19:33Z

17 votes

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

Rushi Shah answered 2019-01-24T16:19:55Z

15 votes

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

Alboz answered 2019-01-24T16:20:38Z

10 votes

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

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

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

import org.codehaus.jackson.map.DeserializationConfig;

...

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

mekdev answered 2019-01-24T16:21:16Z

9 votes

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

Parul answered 2019-01-24T16:21:38Z

7 votes

我正在使用jackson-xxx 2.8.5.Maven Dependency,如:

com.fasterxml.jackson.core

jackson-core

2.8.5

com.fasterxml.jackson.core

jackson-annotations

2.8.5

com.fasterxml.jackson.core

jackson-databind

2.8.5

首先,如果要全局忽略未知属性,可以配置@JsonIgnoreProperties(ignoreUnknown = true)。

如下所示:

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;

}

}

inOut answered 2019-01-24T16:22:21Z

0 votes

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

例如 :

@Bean

public Jackson2ObjectMapperBuilder configureObjectMapper() {

Jackson2ObjectMapperBuilder oMapper = new Jackson2ObjectMapperBuilder();

oMapper.failOnUnknownProperties(false);

return oMapper;

}

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

Thoomas answered 2019-01-24T16:22:54Z

-2 votes

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

Prasanna answered 2019-01-24T16:23:17Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值