2015-07-06 8 views
9

eine JSON-mapped Klasse wie folgt gegeben:Wie kann Jackson @JSONView korrekt verwendet werden, um bestimmte Eigenschaften von der Standardserialisierung auszuschließen?

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

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

ich nur die name Eigenschaft enthalten müssen, wenn wenn (keine Aussicht angegeben dh) unter Verwendung von „normalen“ Serialisierung und umfassen sowohl Eigenschaften, wenn SpecialView mit Serialisierung. Aber wenn ich

tun
objectMapper.writeValueAsString(object) 

(dh die Angabe nicht jede Ansicht), die id Eigenschaft ist im Preis inbegriffen.

Wenn ich

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

dann verhält es sich wie erwartet. Problem ist, ich kontrolliere nicht den ganzen Code, der Serialisierung durchführt, also kann ich es nicht alles zwingen, eine Ansicht zu spezifizieren.

Wenn ich durch den Jackson-Quellcode (v 2.5.4) trat, ich sehe, dass com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields() nicht die _filteredProps nicht verwendet, wenn es keine „aktive Ansicht“ ist:

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

Es scheint seltsam, dass Serialisierung würde nicht respektieren @JsonView, wenn keine Ansicht angegeben ist. Fehle ich etwas?

Gibt es eine Möglichkeit zu erreichen, was ich will?

Antwort

8

Ich lief über das gleiche Problem. Es sieht so aus, als ob Jackson @ JsonView-Annotationen vollständig ignoriert, es sei denn, eine Sicht wird angegeben. Um das gewünschte Verhalten zu erhalten, geben Sie Ihrem Mapper eine Standardansicht von Object.class.

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

Beachten Sie, dass Sie auch Felder ohne @JsonView Anmerkung des ausschließen

mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false); 

mit diesem mit Jackson ist 2.6.3

+0

Dies wäre eine gute Lösung sein, aber wie ich in der Frage, sagte Ich kontrolliere nicht den Code, der den 'ObjectMapper' erstellt und konfiguriert –

Verwandte Themen