杰克逊.将缺少的属性反序列化为空可选

Art*_*nko 8 java json jackson java-8

假设我有这样一个类:

public static class Test {

        private Optional<String> something;

        public Optional<String> getSomething() {
            return something;
        }

        public void setSomething(Optional<String> something) {
            this.something = something;
        }

    }
Run Code Online (Sandbox Code Playgroud)

如果我反序列化这个JSON,我得到一个空的可选:

{"something":null}
Run Code Online (Sandbox Code Playgroud)

但是如果缺少属性(在这种情况下只是空JSON),我得到null而不是Optional.我当然可以自己初始化字段,但我认为最好有一个null和缺少属性的机制.那么有没有办法让jackson反序列化缺少的属性为空可选?

ass*_*ias 6

Optional 并不是真的要用作字段,而是更多地用作返回值。为什么没有:

public static class Test {
  private String something;
  public Optional<String> getSomething() {
    return Optional.ofNullable(something);
  }
  public void setSomething(String something) {
    this.something = something;
  }
}
Run Code Online (Sandbox Code Playgroud)

  • oracle 不这么认为 http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html (2认同)
  • @AdamSkywalker 取决于 Oracle 的哪个来源 - 从事 API 工作的人 [似乎有不同的想法](http://stackoverflow.com/a/23464794/829571)。 (2认同)
  • @ArtemMalinko 我认为开销不是很大 - 如果创建和 GC 短生命对象所需的几纳秒是此类中的一个问题,您可能根本不应该使用 Optional ......您可以分析您的应用程序找到真正的影响, (2认同)

gam*_*ela 6

对于没有 getter/setter 的解决方案,请确保something像这样初始化:

public Optional<String> something = Optional.empty();
Run Code Online (Sandbox Code Playgroud)