2016-01-27 6 views
6

Diciamo che ho una classe come questa:Jackson. Deserializzare proprietà mancanti come vuoti opzionale

public static class Test { 

     private Optional<String> something; 

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

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

    } 

Se deserializzare questo JSON, ottengo un vuoto Optional:

{"something":null} 

Ma se la proprietà non è presente (in questo caso solo JSON vuoto), ottengo null invece di Opzionale. Potrei inizializzare i campi da solo, naturalmente, ma penso che sarebbe meglio avere un meccanismo per le proprietà nulle e mancanti. Quindi c'è un modo per far deserializzare le proprietà mancanti di Jackson come vuote Opzionale?

+0

Sembra modo conveniente per distinguere tra 'null' e il valore assente per me –

risposta

3

Opzionale non è pensato per essere utilizzato come campo ma come valore di ritorno. Perché non hanno:

public static class Test { 
    private String something; 
    public Optional<String> getSomething() { 
    return Optional.ofNullable(something); 
    } 
    public void setSomething(String something) { 
    this.something = something; 
    } 
} 
+1

Oracle non la pensa così http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html – AdamSkywalker

+1

@AdamSkywalker dipende da quale fonte di Oracle - le persone che hanno lavorato sull'API [sembrano pensare in modo diverso] (http://stackoverflow.com/a/23464794/829571). – assylias

+0

ok, sembra legittimo – AdamSkywalker

0

Per una soluzione senza getter/setter, assicurarsi something ottenere inizializzato in questo modo:

public Optional<String> something = Optional.empty();