2015-07-06 7 views
9

Data una classe JSON mappato simili:Come utilizzare correttamente @JSONView Jackson per escludere proprietà specifiche dalla serializzazione predefinita?

public class Person { 
    @JsonProperty 
    String getName() { ... } 

    @JsonProperty @JsonView(SpecialView.class) 
    String getId() { ... } 
} 

devo includere solo la proprietà name quando quando si utilizza la serializzazione "normale" (cioè, senza vista specificato), e comprendono entrambe le proprietà durante la serializzazione utilizzando SpecialView. Ma quando faccio

objectMapper.writeValueAsString(object) 

(vale a dire, non specificando alcuna vista), la proprietà id è incluso.

Se faccio

objectMapper..writerWithView(Object.class).writeValueAsString(object) 

allora si comporta come previsto. Il problema è che non controllo tutto il codice che sta facendo la serializzazione, quindi non posso forzare tutto per specificare una vista.

Quando ho varcato il codice sorgente Jackson (v 2.5.4), vedo che com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields() non usa il _filteredProps se non c'è "vista attiva":

if (_filteredProps != null && provider.getActiveView() != null) { 
     props = _filteredProps; 
    } else { 
     props = _props; 
    } 

Sembra strano che la serializzazione avrebbe non rispettare @JsonView quando non viene specificata alcuna vista. Mi sto perdendo qualcosa?

C'è un modo per ottenere ciò che voglio?

risposta

8

Ho incontrato lo stesso problema. Sembra che Jackson ignori totalmente le annotazioni @JsonView a meno che non venga specificata una vista. Per ottenere il comportamento che stai cercando, dai al tuo mappatore una visualizzazione predefinita di Object.class.

mapper.setConfig(mapper.getSerializationConfig().withView(Object.class)); 

noti che è possibile anche escludere i campi senza @JsonView annotazione di utilizzare

mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false); 

Questo è con Jackson 2.6.3

+0

Questa sarebbe una buona soluzione, ma come ho detto nella questione , Non controllo il codice che crea e configura 'ObjectMapper' –