杰克逊在没有自定义序列化程序的情况下忽略空对象“ {}”

时间:2018-12-20 12:52:04

标签: 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;

序列化后看起来像

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

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

4 个答案:

答案 0 :(得分:2)

添加@JsonInclude(Include.NON_EMPTY)删除空对象:

@JsonInclude(Include.NON_EMPTY)
class School {
  

该值指示仅包含具有非空值的属性。

答案 1 :(得分:1)

有点晚了,添加JsonInclude自定义

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


@EqualsAndHashCode
class Room {
      String name;
}

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

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

答案 2 :(得分:0)

在杰克逊映射器上设置以下内容(如果您使用的是Spring,则可以使用配置类对它进行全局配置)。

jacksonMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
jacksonMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);

使用此映射器进行的任何序列化和反序列化现在都将忽略空或空的字段。

答案 3 :(得分:0)

TLDR:由于对象已被实例化,所以您想要的行为将不起作用。


Include.NON_EMPTY
Include.NON_NULL

这些选项与您尝试执行的操作不兼容的原因是因为您实例化了一个Room类型的Object,因此Room不为空或为null,因此您的输出为:{ "name": "name", "room": {}}

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

自定义序列化程序可以更好地处理此问题,请参见:Do not include empty object to Jackson