Jackson - Sérialiseur personnalisé

Jackson - Sérialiseur personnalisé

1. Vue d'ensemble

Ce tutoriel rapide montrera comment sérialiser une entité Java avec Jackson 2 en utilisant unCustom Serializer.

Si vous voulez creuser plus profondément et apprendreother cool things you can do with the Jackson 2 - allez àthe main Jackson tutorial.

2. Sérialisation standard d'un graphe d'objets

Définissons 2 entités simples et voyons comment Jackson les sérialise sans aucune logique personnalisée:

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

Maintenant, sérialisons une entitéItem avec une entitéUser:

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

Cela se traduira par une représentation JSON complète pour les deux entités:

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

3. Sérialiseur personnalisé sur lesObjectMapper

Maintenant,let’s simplify the JSON output ci-dessus en ne sérialisant que lesid desUser, pas l'ensemble de l'objetUser; nous aimerions obtenir le JSON plus simple suivant:

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

En termes simples, nous devronsdefine a custom Serializer pour les objetsItem:

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

Maintenant, nous devons enregistrer ce sérialiseur personnalisé avec leObjectMapper pour la classeItem et effectuer la sérialisation:

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

Voilà, nous avons maintenant une sérialisation JSON personnalisée plus simple des entitésItem→User.

4. Sérialiseur personnalisé sur la classe

On peut aussiregister the serializer directly on the class, au lieu de sur lesObjectMapper:

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

Maintenant, lors de l'exécution destandard serialization:

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

Nous obtiendrons la sortie JSON personnalisée, créée par le sérialiseur, spécifiée via@JsonSerialize:

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

Ceci est utile lorsque lesObjectMapper ne sont pas accessibles ni configurés directement.

5. Conclusion

Cet article explique comment accéder à une sortie JSON personnalisée avec Jackson 2, à l'aide de sérialiseurs.

L'implémentation de tous ces exemples et extraits de codecan be found on GitHub - il s'agit d'un projet basé sur Maven, il devrait donc être facile à importer et à exécuter tel quel.