Eigenschaften mit JacksonJson dynamisch ignorieren

8

Ich bin mir bewusst, dass es mehrere Möglichkeiten gibt, Jackson Jackson zu ignorieren Eigenschaften beim Rendern, aber alle sind statisch. (JasonIgnore, MixIn-Klassen, ..).

Das ist mein Szenario. Ein Domänenobjekt kann eine Schnittstelle namens FilteredDomain implementieren erlaube es, dynamisch gefiltert zu werden. Die Schnittstelle ist einfach und bietet nur eine Methode "getIgnoreProperties". (Eine Liste der zu ignorierenden Eigenschaften.)

Ich registriere dann einen Custom Serializer, der an das FilteredDomain-Objekt bindet. Das Code sieht ungefähr so ​​aus:

%Vor%

Erstens mag ich wirklich nicht, dass ich den Spring Bean-Wrapper verwenden muss, um eine Liste aller Eigenschaften zu erhalten und sie zu durchlaufen (es muss einen Weg geben, dies zu tun ist Jackson JSON).

Zweitens: Der Code funktioniert immer noch nicht. Ich bekomme den Fehler:

org.codehaus.jackson.JsonGenerationException: Kann keinen Feldnamen schreiben und erwartet einen Wert     bei org.codehaus.jackson.impl.JsonGeneratorBase._reportError (JsonGeneratorBase.java:480)     bei org.codehaus.jackson.impl.Utf8Generator.writeFieldName (Utf8Generator.java:270)     bei org.codehaus.jackson.JsonGenerator.writeObjectField (JsonGenerator.java:1088)     unter com.rootmusic.util.SystemJsonObjectMapper $ ValueObjectSerializer.serialize (SystemJsonObjectMapper.java:65)     unter com.rootmusic.util.SystemJsonObjectMapper $ ValueObjectSerializer.serialize (SystemJsonObjectMapper.java:1)     at org.codehaus.jackson.map.ser.ContainerSerializers $ IndexedListSerializer.serializeContents (ContainerSerializers.java304)     at org.codehaus.jackson.map.ser.ContainerSerializers $ IndexedListSerializer.serializeContents (ContainerSerializers.java:254)     unter org.codehaus.jackson.map.ser.ContainerSerializers $ AsArraySerializer.serialize (ContainerSerializers.java:142)     unter org.codehaus.jackson.map.ser.MapSerializer.serializeFields (MapSerializer.java:287)     unter org.codehaus.jackson.map.ser.MapSerializer.serialize (MapSerializer.java:212)     bei org.codehaus.jackson.map.ser.MapSerializer.serialize (MapSerializer.java:23)     unter org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue (StdSerializerProvider.java:606)     unter org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue (StdSerializerProvider.java:280)

    
Tobias 12.08.2011, 09:23
quelle

1 Antwort

8

Der Fehler rührt von der Tatsache her, dass Sie nicht START_OBJECT / END_OBJECT um Feldname / Wert-Paare schreiben, so dass es leicht zu beheben ist.

Für eine dynamischere Filterung können Sie diesen Blog-Eintrag lesen, der Standard enthält Methoden. @JsonView funktioniert, wenn Sie statische Definitionen haben (eine davon können Sie dynamisch auf Serialisierungsbasis auswählen), aber wenn Sie ein dynamischeres System wünschen, ist @JsonFilter der richtige Weg.

Alternativ wäre eine andere relativ einfache Methode, Ihr POJO zuerst in eine Map zu konvertieren:

Karte requisiten = objectMapper.convertValue (pojo, Map.class);

(ähnlich wie JSON, außer dass das Ergebnis eine Map ist, die als JSON gerendert wird)

und dann schneiden Sie Map selektiv und serialisieren das als JSON. Oder, wenn Sie möchten, können Sie JsonNode ("Baummodell") als Zwischenprodukt zum Modifizieren und Serialisieren verwenden.

    
StaxMan 13.08.2011, 00:20
quelle

Tags und Links