Jackson - Serializador personalizado

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