Jackson 忽略没有自定义序列化程序的空对象“{}”

Amb*_*mbi 11 java json jackson

我想将包含另一个具有空值的 POJO 的 POJO 序列化为 JSON。

例如,给定:

class School {
  String name;
  Room room;
}

class Room {
  String name;
}

Room room = new Room();
School school = new School("name");
school.room = room;
Run Code Online (Sandbox Code Playgroud)

序列化后它看起来像这样

{ "name": "name", "room": {}}

{}如果类的所有字段也都是空的,是否可以排除空对象?理想情况下,无需编写自定义代码即可对每个对象进行全局处理。

小智 8

有点晚了,添加 JsonIninclude 自定义

class School {
  String name;
  @JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = Room .class)
  Room room;
}


@EqualsAndHashCode
class Room {
      String name;
}
Run Code Online (Sandbox Code Playgroud)

如果 等于 ,这将避免包含空间new Room()。不要忘记在 Room 类中实现 equals 方法并包含一个空的构造函数

此外,您可以在类级别使用@JsonInclude( Include.NON_EMPTY )或来跳过可能的空值或空值@JsonInclude( Include.NON_DEFAULT )


小智 4

TLDR:您想要的行为将不起作用,因为对象已被实例化,需要为空。


Include.NON_EMPTY
Include.NON_NULL

这些选项不适用于您想要执行的操作的原因是因为您已经实例化了 Room 类型的对象,因此 Room 不为空或为 null,因此您的输出:{ "name": "name", "room": {}}

如果您实际上希望避免在 JSON 中表示 Room,则该对象需要为 null。通过设置,school.room = null您将获得所需的输出,但在现实世界中,这可能会变得混乱,因为您必须在将 School 中的 Room 设置为空之前评估对象中的字段是否实际上为空。

自定义序列化器可以更好地处理这个问题,请参阅:Do not includeempty object to Jackson