如果inner类中的字段name的值为空,则{【id】:123,【inner】:{}}作为响应返回。但是,如果inner的值作为{}返回,则键值对“内部”:{}应完全忽略,因此响应为{“id”:123}。这怎么能实现呢?我以为用@JsonInclude(JsonInclude.Include.NON_NULL)就能实现,但并没有解决问题。第一个
inner
name
@JsonInclude(JsonInclude.Include.NON_NULL)
vsaztqbk1#
您可以在Item类中的Inner字段上使用@JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = Inner .class),但要使其正常工作,您需要覆盖Item类中的hashcode和equals方法。基本上,当决定内部对象是否应该被排除时,内部类中的equals方法将被调用。如果equals返回true,则该对象将从响应中排除。因此,使该方法匹配任何你想过滤掉的内容,并为任何应该正常写出的内容返回false。您可以阅读更多详情here对于您的特定情况,下面的代码应该有效:
Item
Inner
@JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = Inner .class)
equals
true
false
@Data public class Item { private int id; @JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = Inner .class) private Inner inner; public int getId() { return id; } public void setId(int id) { this.id = id; } public Inner getInner() { return inner; } public void setInner(Inner inner) { this.inner = inner; } @Data public static class Inner { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Inner inner = (Inner) o; return Objects.equals(name, inner.name); } @Override public int hashCode() { return Objects.hash(name); } } }
注意:@JsonInclude(JsonInclude.Include.NON_NULL)将忽略空字段,因此如果您将其放在Inner类的类级别上,您将得到如下响应(它将忽略内部类中的name字段,因为它的值为null):
null
{ "id": 123, "inner": {} }
如果你把它放在类Item的类级别上,也不会起作用,因为你的Inner对象不是null,它是空对象,所以会产生这样的结果:
{ "id": 123, "inner": { "name": null } }
drnojrws2#
请在类级别尝试使用下面的。
@JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL)
谢谢你
3qpi33ja3#
通过使用JsonInclude注解,它将删除空值。
JsonInclude
@Data @JsonInclude(JsonInclude.Include.NOT_NULL) public class Item { private int id; private Inner inner; public static class Inner { private String name; } }
3条答案
按热度按时间vsaztqbk1#
您可以在
Item
类中的Inner
字段上使用@JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = Inner .class)
,但要使其正常工作,您需要覆盖Item
类中的hashcode和equals方法。基本上,当决定内部对象是否应该被排除时,内部类中的
equals
方法将被调用。如果equals返回true
,则该对象将从响应中排除。因此,使该方法匹配任何你想过滤掉的内容,并为任何应该正常写出的内容返回false
。您可以阅读更多详情here
对于您的特定情况,下面的代码应该有效:
注意:
@JsonInclude(JsonInclude.Include.NON_NULL)
将忽略空字段,因此如果您将其放在Inner
类的类级别上,您将得到如下响应(它将忽略内部类中的name
字段,因为它的值为null
):如果你把它放在类
Item
的类级别上,也不会起作用,因为你的Inner
对象不是null,它是空对象,所以会产生这样的结果:drnojrws2#
请在类级别尝试使用下面的。
谢谢你
3qpi33ja3#
通过使用
JsonInclude
注解,它将删除空值。