2015-07-06 11 views
9

Biorąc pod uwagę klasę JSON odwzorowany tak:Jak poprawnie używać Jackson @ JSONView, aby wykluczyć określone właściwości z serializacji domyślnej?

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

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

muszę to tylko właściwość name gdy podczas korzystania z „normalną” serializacji (czyli bez widoku określony) i obejmują zarówno właściwości podczas szeregowania użyciu SpecialView. Ale kiedy zrobić

objectMapper.writeValueAsString(object) 

(tj, nie określając dowolny widzenia), nieruchomość id jest włączone.

Jeśli robię

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

następnie zachowuje się zgodnie z oczekiwaniami. Problem polega na tym, że nie kontroluję całego kodu, który robi serializację, więc nie mogę wymusić tego wszystkiego, aby określić widok.

Kiedy wszedł poprzez kod źródłowy Jackson (v 2.5.4), widzę, że com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields() nie używa _filteredProps jeśli nie ma „Widok aktywny”:

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

Wydaje się dziwne, że będzie serializacji nie szanować @JsonView, gdy nie określono widoku. Czy czegoś brakuje?

Czy istnieje sposób na osiągnięcie tego, czego chcę?

Odpowiedz

8

Przebiegłem ten sam problem. Wygląda na to, że Jackson całkowicie ignoruje adnotacje @JsonView, chyba że podany jest widok. Aby uzyskać pożądane zachowanie, ustaw program odwzorowujący jako domyślny widok klasy Object.class.

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

pamiętać, że można również wykluczyć pola bez @JsonView adnotacja Korzystanie

mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false); 

To jest z Jacksonem 2.6.3

+0

Byłoby to dobre rozwiązanie, ale jak już mówiłem w pytaniu Nie kontroluję kodu, który tworzy i konfiguruje obiekt 'ObjectMapper' –