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'è.