Jackson:忽略空对象

z5btuh9x  于 2022-11-08  发布在  其他
关注(0)|答案(3)|浏览(162)

如果inner类中的字段name的值为空,则
{【id】:123,【inner】:{}}
作为响应返回。但是,如果inner的值作为{}返回,则键值对
“内部”:{}
应完全忽略,因此响应为
{“id”:123}
。这怎么能实现呢?我以为用@JsonInclude(JsonInclude.Include.NON_NULL)就能实现,但并没有解决问题。
第一个

vsaztqbk

vsaztqbk1#

您可以在Item类中的Inner字段上使用@JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = Inner .class),但要使其正常工作,您需要覆盖Item类中的hashcode和equals方法。
基本上,当决定内部对象是否应该被排除时,内部类中的equals方法将被调用。如果equals返回true,则该对象将从响应中排除。因此,使该方法匹配任何你想过滤掉的内容,并为任何应该正常写出的内容返回false
您可以阅读更多详情here
对于您的特定情况,下面的代码应该有效:

@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):

{
    "id": 123,
    "inner": {}
}

如果你把它放在类Item的类级别上,也不会起作用,因为你的Inner对象不是null,它是空对象,所以会产生这样的结果:

{
    "id": 123,
    "inner": {
        "name": null
    }
}
drnojrws

drnojrws2#

请在类级别尝试使用下面的。

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)

谢谢你

3qpi33ja

3qpi33ja3#

通过使用JsonInclude注解,它将删除空值。

@Data
@JsonInclude(JsonInclude.Include.NOT_NULL)
public class Item {
    private int id;
    private Inner inner;

    public static class Inner {
        private String name;
    }
}

相关问题