网站首页 > 精选教程 正文
在本文中,我们将学习如何使用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实体中。
- 上一篇: idea常用java插件
- 下一篇: redis缓存使用之二:redis以什么样的形式来存储对象
猜你喜欢
- 2025-01-05 什么是JSON?
- 2025-01-05 SpringBoot读取资源目录中的JSON文件方法
- 2025-01-05 Fastjson妙用之@JSONField注解
- 2025-01-05 程序员必备的JSON到代码的快速转换神器,支持多种语言(C#、Go、Swift、C++、Java、TypeScript 等)
- 2025-01-05 Java安全-Java Vuls(Fastjson、Weblogic漏洞复现)
- 2025-01-05 Jackson 反序列化必修课:未知属性的"坑",你踩对了吗?
- 2025-01-05 一文带你认识目前最快的Java框架:Vert.x
- 2025-01-05 @JsonProperty详细说明
- 2025-01-05 Java 反射 和 Java new 的效率有什么区别,亲测相差100倍
- 2025-01-05 Python技能:JSON文件的语法和解析
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)