Jackson JSON-Objekt Ändern, Bevor die Serialisierung
Ich bin auf der Suche um ein Objekt zu verändern, bevor es richtig wird serialisiert. Ich möchten, schreiben Sie eine benutzerdefinierte serializer zu analysieren das Objekt, dann übergeben Sie es an den Standard-Objekt-Serialisierung.
Dies ist, was ich habe:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
/**
*
* @author Me
*/
public class PersonSerializer extends JsonSerializer<Person>{
@Override
public void serialize(Person value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
//This returns a modified clone of Person value.
Person safePerson = PrivacyService.getSafePerson(value);
provider.defaultSerializeValue(safePerson, jgen);
}
}
Aber das geht nur in einem infinate Schleife. Ich habe auch versucht:
provider.findTypedValueSerializer(Person.class, true, null).serialize(safePerson, jgen, provider);
Funktioniert, aber es funktioniert nicht Parsen der Felder im Objekt.
Ich auch versucht, mit einer @JsonFilter
aber es war sehr schwer und versechsfachte meine Last mal.
Hilfe! Danke!
- Warum würden Sie dies tun, möchten Sie etwas zu verstecken in der Person-Objekt, bevor Sie senden es zurück an den client?
- Ja, ich habe einen Dienst, der reinigt sich das Person-Objekt und gibt die gereinigte Klon von ihm. Die Sache ist die, dass sich je nach dem warum Sie sind angemeldet als bestimmt, wie viele Daten entfernt.
- Es gibt auch Fälle, wo ich bin serialisiert ein array mit zwei verschiedenen Menschen innerhalb des Arrays, und ich entfernen müssen verschiedene Dinge von jedem.
- Jackson Ansichten und Ansichten, die bestimmt sind, zu lösen diese Art von problem. wiki.fasterxml.com/JacksonJsonViews
- Große finden! Von was ich sehen kann obwohl, das würde bedeuten ich müsste kommentieren jedes Feld in dieser Klasse (und es gibt 40+) und dann zu verwalten, jeder. Das wäre ein wenig chaotisch, was ich Suche zu tun.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Obwohl ich anfangs freuten sich über das Auffinden der @Nitroware Antwort, es funktioniert leider nicht in Jackson 2.7.2 -
BeanSerializerFactory.instance.createSerializer
führt eine IntrospektionJsonSerializer
annotation aufPerson
Klasse wieder, das führt zu einer unendlichen Rekursion undStackOverflowError
.Dem Punkt, wo Standard-serializer erstellt würde, wenn
@JsonSerializer
waren abwesend auf die POJO-Klasse ist dieBeanSerializerFactory.constructBeanSerializer
Methode. Also lasst uns einfach diese Methode verwenden, direkt. Da die Methodeprotected
- wir machen es sichtbar über factory-Unterklasse und füttern Sie es mit Informationen über serialisierte Klasse. Auch ersetzen wir veralteteSimpleType.construct
Methode, mit der empfohlenen Ersatz. Gesamte Lösung ist:Im Gegensatz zu
BeanSerializerModifier
-basierte Lösung, wo Sie gezwungen sind, zu deklarieren und zu registrieren, ein spezielles Verhalten außerhalb Ihrer benutzerdefinierte serializer, mit dieser Lösung spezielle Logik ist noch gekapselt in benutzerdefiniertenPersonSerializer
.Schließlich die Logik kann hochgedrückt werden, um benutzerdefinierte
DefaultJsonSerializerAware
Vorfahren.UPDATE 2017-09-28:
Fand ich Fehler in der Argumentation oben angegeben. Mit Sohle
BeanSerializerFactory.constructBeanSerializer
Methode ist nicht genug. Wenn die ursprüngliche Klasse enthält null-Felder, Sie sind nicht im output. (Der Grund dafür ist dieconstructBeanSerializer
Methode ist indirekt aufgerufencreateAndCacheUntypedSerializer
Methode, die später AnrufeaddAndResolveNonTypedSerializer
Methode, woNullSerializer
s sind Hinzugefügt inBeanPropertyWriter
s).)Lösung für dieses problem, das scheint korrekt zu mir und ist ganz einfach ist die Wiederverwendung aller Serialisierung Logik, nicht nur constructBeanSerializer Methode. Diese Logik beginnt in Anbieters
serializeValue
Methode. Den nur unangemessen, was ist customJsonSerialize
annotation. Also wir definierenBeanSerializationFactory
zu behaupten, dass die introspektiert Klasse (und nur Sie - sonst JsonSerialize Anmerkungen auf Feld-Typen nicht gelten würden) hat keineJsonSerialize
annotation.Hinweis: wenn Sie nicht leiden, ein problem mit null-Werten, die Vorherige Lösung ist genug für Sie.
Da Jackson 2.2 man könnte den Konverter in JsonSerialize Anmerkung:
@JsonSerialize(converter = OurConverter.class)
dem Konverter
public class OurConverter extends StdConverter<IN, OUT>
IN und OUT sind in der gleichen Klasse ändern, wenn Objekt
Heilige Scheiße, nach mehreren Stunden Graben durch diese Bibliothek, zu schreiben versucht, meine eigene Fabrik, und tausend andere Dinge, ich habe ENDLICH dieses blöde Ding zu machen, was ich wollte: