Jackson - Serializador personalizado

1. Información general

Este rápido tutorial le mostrará cómo serializar una entidad Java con Jackson 2 usando un serializador personalizado .

Si desea profundizar y aprender otras cosas interesantes que puede hacer con Jackson 2 , diríjase al tutorial principal de Jackson.

2. Serialización estándar de un gráfico de objetos

Definamos 2 entidades simples y veamos cómo Jackson las serializa sin ninguna lógica personalizada:

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

Ahora, serialicemos una entidad Item con una entidad User :

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

Esto dará como resultado una representación JSON completa para ambas entidades:

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

3. Serializador personalizado en ObjectMapper

Ahora, simplifiquemos la salida JSON anterior solo serializando la identificación del Usuario , no todo el objeto Usuario ; nos gustaría obtener el siguiente JSON más simple:

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

En pocas palabras, tendremos que definir un serializador personalizado para los objetos 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(); } }

Ahora, necesitamos registrar este serializador personalizado con ObjectMapper para la clase Item y realizar la serialización:

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

Eso es todo: ahora tenemos una serialización JSON personalizada más simple de las entidades Item-> User .

4. Serializador personalizado en la clase

También podemos registrar el serializador directamente en la clase , en lugar de en el ObjectMapper :

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

Ahora, al realizar la serialización estándar :

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

Obtendremos la salida JSON personalizada, creada por el serializador, especificada a través de @JsonSerialize :

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

Esto es útil cuando no se puede acceder y configurar el ObjectMapper directamente.

5. Conclusión

Este artículo ilustró cómo llegar a una salida JSON personalizada con Jackson 2, mediante el uso de serializadores.

La implementación de todos estos ejemplos y fragmentos de código se puede encontrar en GitHub : este es un proyecto basado en Maven, por lo que debería ser fácil de importar y ejecutar tal como está.