在本文中,我们将学习如何使用Jackson ,将JSON解析为Java 对象时忽略未知的JSON属性。
要了解更多关于Jackson的用法,请移步Jackson系列文章
若第一时间获取相关知识,请关注公众号:susht
1.解析带有未知字段的JSON字符串
1.1. 默认Jackson未知属性
默认情况下,如果Java类不包含与所有JSON属性相对应的所有字段,Jackson API将引发异常。
例如,我们有以下JSON对象:
{
"name": "John Doe",
"email": "john.doe@example.com",
"admin": true,
"age": 32
}
现在,我们想将上述JSON对象反序列化为以下Java类User
:
public class User {
private String name;
private String email;
private boolean admin;
public User() {
}
public User(String name, String email, boolean admin) {
this.name = name;
this.email = email;
this.admin = admin;
}
//省略 getters and setters, toString()
}
如上所示,User
类不包含与age
JSON属性匹配的任何字段。解析上述JSON 将导UnrecognizedPropertyException
异常:
@Test //默认Jackson未知属性行为
public final void defaultJsonToObject() throws JsonProcessingException {
String jsonString = "{\"name\":\"John Doe\",\"email\":\"john.doe@example.com\"," +
"\"admin\":true,\"age\":32}";
ObjectMapper mapper=new ObjectMapper();
User user=mapper.readValue(jsonString,User.class);
System.out.println(user);
}
上面的代码运行失败,并抛出以下异常:
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "age" (class com.baeldung.jackson.unknownproperties.User), not marked as ignorable (3 known properties: "name", "email", "admin"])
1.2. 类级别忽略未知的JSON属性
要忽略单个类的所有未知属性,只需在类的顶部声明@JsonIgnoreProperties
注释即可,如下所示:
@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
// ...
}
再次执行上面的代码,您将看到以下输出
User{name='John Doe', email='john.doe@example.com', admin=true}
1.3. 全局忽略未知的JSON属性
解析JSON时处理未知属性的另一种方法是配置ObjectMapper
类,使其在遇到未知的属性时不会反序列化失败:
@Test //默认Jackson未知属性行为
public final void configJsonToObject() throws JsonProcessingException {
String jsonString = "{\"name\":\"John Doe\",\"email\":\"john.doe@example.com\"," +
"\"admin\":true,\"age\":32}";
ObjectMapper mapper=new ObjectMapper();
// 配置忽略未知属性
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
User user=mapper.readValue(jsonString,User.class);
System.out.println(user);
}
再次执行上面的代码,您将看到以下输出
User{name='John Doe', email='john.doe@example.com', admin=true}
2.解析不完整的JSON
与其他未知字段类似,解析不完整的JSON(不包含Java类中所有字段的JSON)对于Jackson来说也不是问题:
@Test
public final void incompleteJsonToObject() throws JsonProcessingException {
String jsonString = "{\"name\":\"John Doe\"}";
ObjectMapper mapper=new ObjectMapper();
User user=mapper.readValue(jsonString,User.class);
System.out.println(user);
}
输出结果
User{name='John Doe', email='null', admin=false}
3. 结论
本文介绍了如何使用Jackson反序列化一个带有未知属性的JSON。这是在使用Jackson时最常见的配置之一,因为我们经常需要将外部REST API的JSON结果映射到java实体中。
网友评论