Jackson - Serializzatore personalizzato

1. Panoramica

Questo breve tutorial mostrerà come serializzare un'entità Java con Jackson 2 utilizzando un serializzatore personalizzato .

Se vuoi approfondire e imparare altre cose interessanti che puoi fare con Jackson 2, vai al tutorial principale di Jackson.

2. Serializzazione standard di un oggetto grafico

Definiamo 2 entità semplici e vediamo come Jackson le serializza senza alcuna logica personalizzata:

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

Ora serializziamo un'entità Item con un'entità User :

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

Ciò si tradurrà in una rappresentazione JSON completa per entrambe le entità:

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

3. Serializzatore personalizzato su ObjectMapper

Ora, cerchiamo di semplificare l'uscita JSON sopra soltanto la serializzazione l' id del utente , non l'intero utente oggetto; vorremmo ottenere il seguente JSON più semplice:

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

In poche parole, dovremo definire un serializzatore personalizzato per gli oggetti Item :

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(); } }

Ora, dobbiamo registrare questo serializzatore personalizzato con ObjectMapper per la classe Item ed eseguire la serializzazione:

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);

Ecco fatto: ora abbiamo una serializzazione JSON più semplice e personalizzata delle entità Item-> User .

4. Serializzatore personalizzato sulla classe

Possiamo anche registrare il serializzatore direttamente sulla classe , invece che su ObjectMapper :

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

Ora, quando si esegue la serializzazione standard :

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

Otterremo l' output JSON personalizzato, creato dal serializzatore, specificato tramite @JsonSerialize :

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

Ciò è utile quando non è possibile accedere e configurare direttamente ObjectMapper .

5. conclusione

Questo articolo ha illustrato come ottenere un output JSON personalizzato con Jackson 2, utilizzando i serializzatori.

L'implementazione di tutti questi esempi e frammenti di codice può essere trovata su GitHub : questo è un progetto basato su Maven, quindi dovrebbe essere facile da importare ed eseguire così com'è.