【问题标题】:Jackson serialize null or empty objectJackson 序列化 null 或空对象
【发布时间】:2019-09-13 10:08:03
【问题描述】:

有一个 POJO:

class A {
   private B b;
}

其中乙:

class B {
   private String c;
}

是否有适当的方法让 Jackson 序列化 A 的对象,使 A.b = null(甚至 b 的所有字段都为空或默认)以以下形式:

{
   b: {}
}

并且不使用自定义序列化程序。上层POJO其实很复杂,维护序列化器弊大于利。

【问题讨论】:

    标签: java serialization jackson


    【解决方案1】:

    将默认属性包含设置为Include.NON_NULL

    import com.fasterxml.jackson.annotation.JsonInclude.Include;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.SerializationFeature;
    import java.io.IOException;
    
    public class JsonApp {
    
      public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);
        mapper.setDefaultPropertyInclusion(Include.NON_NULL);
    
        System.out.println(mapper.writeValueAsString(new A()));
      }
    }
    
    class A {
      private B b = new B();
    
      public B getB() {
        return b;
      }
    
      public void setB(B b) {
        this.b = b;
      }
    }
    
    class B {
      private String c;
    
      public String getC() {
        return c;
      }
    
      public void setC(String c) {
        this.c = c;
      }
    }
    

    上面的代码打印:

    {
      "b" : { }
    }
    

    【讨论】:

    • 看起来是这样,但是一旦我应用 NON_NULL,“b”就根本不显示(null case)
    • 那么,即使A.b=null,你也需要{"b": {}}?在这种情况下,您需要编写自定义序列化程序。如果您有许多 POJO 类,您可以为它们编写通用序列化器。
    • 是的,一般情况下是这样的。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2013-04-11
    • 2019-12-19
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    相关资源
    最近更新 更多