在使用Jackson和Lombok进行序列化期间移除嵌套类中的null和空对象

arknldoa  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(117)

我尝试在序列化期间使用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。

brccelvz

brccelvz1#

在属性级别定义@JsonInclude时,它会覆盖类级别的值。
现在,由于我们只能定义一个值,对于我们的情况,要么是non_null,要么是not_empty,我们需要寻找其他方法。
使用JsonInclude.Include.CUSTOM,我们可以定义自己的filter类,在该filter类中,我们可以定义一个equals方法,我们自己的逻辑将在输出json中显示。
为了确保non_null和not_empty,下面是一个简单的代码。您可以根据需要更新逻辑

class RoomFilter {
 @Override
 public boolean equals(Object obj) {
    if(obj == null)
        return  true;
    else if(obj instanceof Room) {
        if(((Room)obj).getName() == null)
            return true;
        else
            return false;
    }
    else
        return false;
  }
}

在你的School类更新如下,它应该给你你想要的结果

@JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = RoomFilter.class)
private Room room;

相关问题