如果顶级字段的所有嵌套字段都为空,则Jackson会忽略顶级字段的序列化

问题描述 投票:2回答:3

我正在使用Jackson ObjectMapper来序列化POJO。我在POJO中嵌套了字段。例如:序列化类MyClass

public class MyClass {
    private A a;
    private int i;
    //getters and setters
}

public class A {
    private String s;
    //getters and setters
}

我希望如果String snull,整个属性A都没有被序列化。也就是说,如果String snull,我希望输出为:{"myClass":{"i":10}}

但我得到{"myClass":{"A":{},"i":10}}作为输出。

我已经设置了NON_EMPTY用于序列化包含(mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY)),但它没有解决问题

java serialization jackson
3个回答
0
投票

AFAIK你不能用标准注释做到这一点,但是以这种方式改变MyClass.getA()方法你应该这样做。

  public A getA() {
    if (a.getS() == null)
      return null;
    return a;
  }

0
投票

你只需添加@JsonInclude(JsonInclude.Include.NON_NULL)

@JsonInclude(JsonInclude.Include.NON_NULL)
public class MyClass   extends Serializable {
    private A a;
    private int i;
    //getters and setters
}

public class A  extends Serializable{
    private String s;
    //getters and setters
}

0
投票

在期望的班级中生成hashCode()equals()

public class A  extends Serializable{
    private String s;
    // getters and setters
    // hashCode() and equals()
}

在父类中设置Include.CUSTOM

@JsonInclude(value = Include.CUSTOM, valueFilter = A.class)
public class MyClass extends Serializable {
    private A a;
    private int i;
    //getters and setters
}

将排除所有空对象,输出将为:{"myClass":{"i":10}}

© www.soinside.com 2019 - 2024. All rights reserved.