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á.