java - Java Spring - 在 GET 上忽略嵌套对象类中的 Null 值
问题描述
所以,我有一些奇怪的行为。在我的 Spring 应用程序中,我有两个对象类,一个类嵌套在另一个类中。我正在使用 Jackson 将我的 Object 类序列化为 JSON。在我的第二个对象类 (ObjectB) 中,我有 4 个字段。根据某些 UI 条件,我要么设置字段 1 和 2,要么设置字段 3 和 4,但不会同时设置所有字段。我已经包含了 Jackson 注释以忽略空字段,并且它有效。在我的数据库中,提交后,我只看到字段 1 和 2 或 3 和 4。
当我从数据库中获取数据时,问题就出现了。要将 JSON 映射到我的 Object 类中,我必须在解析 ObjectA 时在我的 ObjectB 类中设置字段。这使我看到所有 4 个字段都被返回,其中一半的值显示为空。我将此信息打印到我的 UI,因此我想通过不返回空值来使其更具可读性。有没有办法做到这一点?我将发布我正在尝试做的代码示例。
对象A类
@JsonAutoDetect(fieldVisibility = Visibility.ANY, isGetterVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class ObjectA {
String field_A1;
String field_A2;
ObjectB field_A3;
//Getters and Setters
}
对象B.class
@JsonAutoDetect(fieldVisibility = Visibility.ANY, isGetterVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class ObjectB {
String field_B1;
String field_B2;
String field_B3;
String field_B4;
//Getters and Setters
}
数据库中的数据 -Object1:{field_A1:"abc",field_A2:"def",field_A3:{field_B1:"ghi",field_B2:"jkl"}}
类 ObjectA 的映射逻辑
ObjectA objA = new ObjectA();
...
ObjectB objB = new ObjectB();
if(jsonObj.get("field_B1") != null) {
objB.setField_B1(jsonObj.get("field_B1"));
}
if(jsonObj.get("field_B2") != null) {
objB.setField_B2(jsonObj.get("field_B2"));
}
if(jsonObj.get("field_B3") != null) {
objB.setField_B3(jsonObj.get("field_B3"));
}
if(jsonObj.get("field_B4") != null) {
objB.setField_B4(jsonObj.get("field_B4"));
}
objA.setField_3(objB);
返回到 UI 的数据 -Object1:{field_A1:"abc",field_A2:"def",field_A3:{field_B1:"ghi",field_B2:"jkl",field_B3:null,field_B4:null}}
解决方案
我仍然不确定您使用的是哪个版本的 Spring,但是4+
如果我没记错的话,您可以定义一个自定义的 Jackson ObjectMapper
Bean。
@Bean
@Primary
public ObjectMapper customObjectMapper() {
final ObjectMapper mapper = new ObjectMapper();
...
mapper.setSerializationInclusion(Include.NON_NULL);
return mapper;
}
推荐阅读
- python - 是否可以在 Python 脚本中将变量传递给 MDX 查询?
- flutter - 底部导航上的无效参数,颤动
- excel - 如何仅更改列变量而不更改路径和公式?
- python - 使用“NoneType”对象失败的多处理(pool.map)不可调用
- sql-server - 尝试根据用户输入选择表,但它不起作用
- c++ - Linux Debian 10 如何使用 c++ 20
- reporting-services - CountDistinct 的运行值
- nlme - “协变量必须在 corCAR1 对象的组内具有唯一值?” 找不到错误
- button - 如何在流利的用户界面中在图标下方添加文本
- java - 获取文本文件值,拆分,输出到 JTextArea