Jackson - Serializador personalizado
1. Visão geral
Este tutorial rápido mostrará como serializar uma entidade Java com Jackson 2 usando umCustom Serializer.
Se você quiser se aprofundar e aprenderother cool things you can do with the Jackson 2, vá parathe main Jackson tutorial.
2. Serialização padrão de um gráfico de objeto
Vamos definir duas entidades simples e ver como Jackson as serializa sem nenhuma lógica personalizada:
public class User {
public int id;
public String name;
}
public class Item {
public int id;
public String itemName;
public User owner;
}
Agora, vamos serializar uma entidadeItem com uma entidadeUser:
Item myItem = new Item(1, "theItem", new User(2, "theUser"));
String serialized = new ObjectMapper().writeValueAsString(myItem);
Isso resultará em uma representação JSON completa para as duas entidades:
{
"id": 1,
"itemName": "theItem",
"owner": {
"id": 2,
"name": "theUser"
}
}
3. Serializador personalizado noObjectMapper
Agora,let’s simplify the JSON output acima serializando apenasid deUser, não todo o objetoUser; gostaríamos de obter o seguinte JSON mais simples:
{
"id": 25,
"itemName": "FEDUfRgS",
"owner": 15
}
Simplificando, teremos quedefine a custom Serializer para objetosItem:
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();
}
}
Agora, precisamos registrar este serializador personalizado comObjectMapper para a classeItem e realizar a serialização:
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);
É isso - agora temos uma serialização JSON personalizada mais simples das entidadesItem→User.
4. Serializador personalizado na classe
Também podemosregister the serializer directly on the class, em vez de noObjectMapper:
@JsonSerialize(using = ItemSerializer.class)
public class Item {
...
}
Agora, ao realizarstandard serialization:
Item myItem = new Item(1, "theItem", new User(2, "theUser"));
String serialized = new ObjectMapper().writeValueAsString(myItem);
Obteremos a saída JSON personalizada, criada pelo serializador, especificada via@JsonSerialize:
{
"id": 25,
"itemName": "FEDUfRgS",
"owner": 15
}
Isso é útil quandoObjectMapper não pode ser acessado e configurado diretamente.
5. Conclusão
Este artigo ilustrou como obter uma saída JSON personalizada com o Jackson 2, usando Serializers.
A implementação de todos esses exemplos e trechos de códigocan be found on GitHub - este é um projeto baseado em Maven, portanto, deve ser fácil de importar e executar como está.