web-dev-qa-db-fra.com

Comment sérialiser uniquement l'ID d'un enfant avec Jackson

Existe-t-il un moyen intégré de sérialiser uniquement l'ID d'un enfant lors de l'utilisation de Jackson (fastxml.jackson 2.1.1)? Nous voulons envoyer un Order via REST qui a une référence Person. L'objet personne est cependant assez complexe et nous pourrions le rafraîchir côté serveur, nous n'avons donc besoin que de la clé primaire.

Ou ai-je besoin d'un sérialiseur personnalisé pour cela? Ou dois-je @JsonIgnore toutes les autres propriétés? Cela empêcherait-il que les données Person soient renvoyées lors de la demande d'un objet Order? Je ne sais pas encore si j'en aurai besoin, mais j'aimerais en avoir le contrôle si possible ...

53
Pete

Il y a deux façons. La première consiste à utiliser @JsonIgnoreProperties pour supprimer les propriétés d'un enfant, comme ceci:

public class Parent {
   @JsonIgnoreProperties({"name", "description" }) // leave "id" and whatever child has
   public Child child; // or use for getter or setter
}

une autre possibilité, si l'objet enfant est toujours sérialisé en tant qu'id:

public class Child {
    // use value of this property _instead_ of object
    @JsonValue
    public int id;
}

et une autre approche consiste à utiliser @JsonIdentityInfo

public class Parent {
   @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
   @JsonIdentityReference(alwaysAsId=true) // otherwise first ref as POJO, others as id
   public Child child; // or use for getter or setter

   // if using 'PropertyGenerator', need to have id as property -- not the only choice
   public int id;
}

qui fonctionnerait également pour la sérialisation et ignorerait les propriétés autres que id. Cependant, le résultat ne sera pas encapsulé en tant qu'objet.

104
StaxMan

Vous pouvez écrire un sérialiseur personnalisé comme ceci:

public class ChildAsIdOnlySerializer extends StdSerializer<Child> {

  // must have empty constructor
  public ChildAsIdOnlySerializer() {
    this(null);
  }

  public ChildAsIdOnlySerializer(Class<Child> t) {
    super(t);
  }

  @Override
  public void serialize(Child value, JsonGenerator gen, SerializerProvider provider)
      throws IOException {
    gen.writeString(value.id);
  }

Ensuite, utilisez-le en annotant le champ avec @JsonSerialize:

public class Parent {
   @JsonSerialize(using = ChildAsIdOnlySerializer.class)
   public Child child;
}

public class Child {
    public int id;
}
1
cakraww