我尝试在序列化期间使用Camel-Jackson和Lombok从复杂对象中删除空属性和空对象。
我检查了this answer,它可以工作,但是它们直接访问属性,而不使用getter或setter,所以当我使用Lombok的@Getter和@Setter时,它似乎不工作:
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@Getter
@Setter
public class School {
private String name;
@JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = Room.class)
private Room room;
}
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@Getter
@Setter
@EqualsAndHashCode
class Room {
private String name;
}
所以当我用这个的时候:
School school = new School();
school.setRoom(new Room());
String jsonPerson = mapper.writeValueAsString(school);
System.out.println("Linearized json: "+jsonPerson);
它的工作原理Linearized json: {}
但是,如果不为School示例创建新的Room对象
School school = new School();
String jsonPerson = mapper.writeValueAsString(school);
System.out.println("Linearized json: "+jsonPerson);
我越来越{"room":null}
我也试过用手动吸气器和设定器代替Lombok岛的,但它没有像我预期的那样工作。
我用的是 Camel Jackson3.3和Lombok1.18.12。
1条答案
按热度按时间brccelvz1#
在属性级别定义
@JsonInclude
时,它会覆盖类级别的值。现在,由于我们只能定义一个值,对于我们的情况,要么是non_null,要么是not_empty,我们需要寻找其他方法。
使用
JsonInclude.Include.CUSTOM
,我们可以定义自己的filter类,在该filter类中,我们可以定义一个equals
方法,我们自己的逻辑将在输出json中显示。为了确保non_null和not_empty,下面是一个简单的代码。您可以根据需要更新逻辑
在你的
School
类更新如下,它应该给你你想要的结果