网站首页 > java教程 正文
在本文中,我们将学习如何使用Jackson ,将JSON解析为Java 对象时忽略未知的JSON属性。
若第一时间获取相关知识,请关注公众号: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类不包含与ageJSON属性匹配的任何字段。解析上述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实体中。
猜你喜欢
- 2024-12-05 5千字的SpringMVC总结,我觉得你会需要
- 2024-12-05 推荐 10个 NB的 IDEA 插件,开发效率至少提升一倍
- 2024-12-05 SpringBoot系列——Jackson序列化
- 2024-12-05 Java 中如果不实现序列 Serializable 的话,能够进行网络传输么?
- 2024-12-05 Delphi基础教程图文版之JSON
- 2024-12-05 泛型的类型擦除后,fastjson反序列化时如何还原?
- 2024-12-05 SpringBoot中如何让List和Json自动互转
- 2024-12-05 Java单元测试技巧之JSON序列化
- 2024-12-05 基础篇-SpringBoot默认Json框架Jackson解析
- 2024-12-05 java中常用的22种数据类型转换,超详细!
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)