Jackson - Benutzerdefinierter Serializer

1. Übersicht

Dieses kurze Tutorial zeigt, wie Sie eine Java-Entität mit Jackson 2 mithilfe eines benutzerdefinierten Serializers serialisieren .

Wenn Sie tiefer graben und andere coole Dinge lernen möchten, die Sie mit dem Jackson 2 tun können, besuchen Sie das Haupt-Tutorial von Jackson.

2. Standardserialisierung eines Objektgraphen

Lassen Sie uns zwei einfache Entitäten definieren und sehen, wie Jackson diese ohne benutzerdefinierte Logik serialisiert:

public class User { public int id; public String name; } public class Item { public int id; public String itemName; public User owner; }

Lassen Sie uns nun eine Item- Entität mit einer User- Entität serialisieren :

Item myItem = new Item(1, "theItem", new User(2, "theUser")); String serialized = new ObjectMapper().writeValueAsString(myItem);

Dies führt zu einer vollständigen JSON-Darstellung für beide Entitäten:

{ "id": 1, "itemName": "theItem", "owner": { "id": 2, "name": "theUser" } }

3. Benutzerdefinierter Serializer auf dem ObjectMapper

Nun, vereinfachen sie die JSON Ausgabe oben , indem nur die Serialisierung - ID des Benutzers , nicht das gesamte Benutzerobjekt; Wir möchten den folgenden, einfacheren JSON erhalten:

{ "id": 25, "itemName": "FEDUfRgS", "owner": 15 }

Einfach ausgedrückt, müssen wir einen benutzerdefinierten Serializer für Objektobjekte definieren :

public class ItemSerializer extends StdSerializer { public ItemSerializer() { this(null); } public ItemSerializer(Class t) { super(t); } @Override public void serialize( Item value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { jgen.writeStartObject(); jgen.writeNumberField("id", value.id); jgen.writeStringField("itemName", value.itemName); jgen.writeNumberField("owner", value.owner.id); jgen.writeEndObject(); } }

Jetzt müssen wir diesen benutzerdefinierten Serializer beim ObjectMapper für die Item- Klasse registrieren und die Serialisierung durchführen:

Item myItem = new Item(1, "theItem", new User(2, "theUser")); ObjectMapper mapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.addSerializer(Item.class, new ItemSerializer()); mapper.registerModule(module); String serialized = mapper.writeValueAsString(myItem);

Das war's - wir haben jetzt eine einfachere, benutzerdefinierte JSON-Serialisierung der Item-> User- Entitäten.

4. Benutzerdefinierter Serializer für die Klasse

Wir können den Serializer auch direkt in der Klasse anstatt im ObjectMapper registrieren :

@JsonSerialize(using = ItemSerializer.class) public class Item { ... }

Wenn Sie nun die Standard-Serialisierung durchführen :

Item myItem = new Item(1, "theItem", new User(2, "theUser")); String serialized = new ObjectMapper().writeValueAsString(myItem);

Wir erhalten die benutzerdefinierte JSON-Ausgabe, die vom Serializer erstellt wurde und über @JsonSerialize angegeben wird :

{ "id": 25, "itemName": "FEDUfRgS", "owner": 15 }

Dies ist hilfreich, wenn auf den ObjectMapper nicht direkt zugegriffen und konfiguriert werden kann.

5. Schlussfolgerung

Dieser Artikel zeigt, wie Sie mit Jackson 2 mithilfe von Serializern zu einer benutzerdefinierten JSON-Ausgabe gelangen.

Die Implementierung all dieser Beispiele und Codefragmente finden Sie auf GitHub - dies ist ein Maven-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein, wie es ist.