Comment demander à Jackson de sérialiser un champ dans un object au lieu de l’object lui-même?

J’ai une classe d’ Item . Il y a un champ itemType intérieur de cette classe qui est de type ItemType.

en gros, quelque chose comme ça.

 class Item { int id; ItemType itemType; } class ItemType { Ssortingng name; int somethingElse; } 

Lorsque je sérialise un object de type Item aide de Jackson ObjectMapper , il sérialise l’object ItemType tant que sous-object. Ce qui est attendu, mais pas ce que je veux.

 { "id": 4, "itemType": { "name": "Coupon", "somethingElse": 1 } } 

Ce que je voudrais faire est de montrer le itemType de name itemType la place quand il est sérialisé.

Quelque chose comme ci-dessous.

 { "id": 4, "itemType": "Coupon" } 

Y a-t-il un moyen de demander à Jackson de le faire?

Vous devez créer et utiliser un sérialiseur personnalisé .

 public class ItemTypeSerializer extends JsonSerializer { @Override public void serialize(ItemType value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { jgen.writeSsortingng(value.name); } } @JsonSerialize(using = ItemTypeSerializer.class) class ItemType { Ssortingng name; int somethingElse; } 

Consultez l’annotation @JsonValue .

EDIT: comme ceci:

 class ItemType { @JsonValue public Ssortingng name; public int somethingElse; } 

Comme OP souhaite uniquement sérialiser un champ, vous pouvez également utiliser les annotations @JsonIdentityInfo et @JsonIdentityReference :

 class Item { int id; @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="name") @JsonIdentityReference(alwaysAsId=true) ItemType itemType; } 

Pour plus d’informations, voir Comment sérialiser uniquement l’ID d’un enfant avec Jackson .

Une solution rapide consiste peut-être à append un getter supplémentaire à Item pour renvoyer ItemType.name et à marquer ItemType getter avec @JsonIgnore ?

Pour renvoyer une chaîne simple, vous pouvez utiliser par défaut ToSsortingngSerializer sans définir de classes supplémentaires. Mais vous devez définir la méthode toSsortingng () ne renvoyer que cette valeur.

 @JsonSerialize(using = ToSsortingngSerializer.class) class ItemType { Ssortingng name; int somethingElse; public Ssortingng toSsortingng(){ return this.name;} }