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)
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)
这是缺少注释时使用的默认值,可以方便地回退.
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.
Ana*_*ika 79
它可以通过2种方式实现:
标记POJO以忽略未知属性
@JsonIgnoreProperties(ignoreUnknown = true)
Run Code Online (Sandbox Code Playgroud)配置序列化/反序列化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)
所以代码不会破坏.
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)
对于使用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内容转换)。
我正在使用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)
| 归档时间: |
|
| 查看次数: |
445493 次 |
| 最近记录: |