web-dev-qa-db-fra.com

Jackson change dynamiquement JsonIgnore

J'ai une classe et il y a aussi des variables à l'intérieur. Parfois, je veux ignorer certains champs et parfois pas lors de la désérialisation (peut-être aussi lors de la sérialisation). Comment puis-je le faire à Jackson?

24
kamaci

Pour la sérialisation, " filtrage des propriétés " entrée de blog devrait aider. La désérialisation a moins de support, car il est plus courant de vouloir filtrer les choses écrites.

Une approche possible consiste à sous-classe JacksonAnnotationIntrospector, en remplaçant les méthodes qui ignorent l’ignorabilité des méthodes (et/ou des champs) afin d’utiliser la logique de votre choix.

Cela pourrait également être utile si vous donniez un exemple d'application pratique, c'est-à-dire quoi et pourquoi vous essayez d'empêcher la désérialisation.

20
StaxMan

Vous voudrez peut-être utiliser JsonViews (extrait de http://wiki.fasterxml.com/JacksonJsonViews - cassé maintenant - lien d'archive Web: https://web.archive.org/web/20170831135842/ http://wiki.fasterxml.com/JacksonJsonViews )

En le citant:

Premièrement, définir des vues signifie déclarer des classes; vous pouvez réutiliser des classes existantes ou simplement créer de fausses classes. Il s’agit simplement d’identifiants de vue avec des informations sur les relations (l’enfant hérite de l’adhésion à la vue des parents):

 // View definitions:
  class Views {
            static class Public { }
            static class ExtendedPublic extends PublicView { }
            static class Internal extends ExtendedPublicView { }
  }

  public class Bean {
            // Name is public
            @JsonView(Views.Public.class) String name;
            // Address semi-public
            @JsonView(Views.ExtendPublic.class) Address address;
            // SSN only for internal usage
            @JsonView(Views.Internal.class) SocialSecNumber ssn;
  }

Avec de telles définitions d’affichage, la sérialisation se ferait comme suit:

 // short-cut:
  objectMapper.writeValueUsingView(out, beanInstance, ViewsPublic.class);

  // or fully exploded:
  objectMapper.getSerializationConfig().setSerializationView(Views.Public.class);
  // (note: can also pre-construct config object with 'mapper.copySerializationConfig'; reuse)
  objectMapper.writeValue(out, beanInstance); // will use active view set via Config

  // or, starting with 1.5, more convenient (ObjectWriter is reusable too)
  objectMapper.viewWriter(ViewsPublic.class).writeValue(out, beanInstance);
and result would only contain 'name', not 'address' or 'ssn'.
1
João Antunes

Vous devriez probablement regarder la fonctionnalité modules des versions récentes de Jackson.

Un mécanisme possible consisterait à utiliser un BeanDeserializerModifier .

Je cherchais un tutoriel ou un exemple en ligne utile, mais rien ne s'affiche immédiatement. Il serait peut-être possible d’élaborer quelque chose si on en sait plus sur votre contexte. Gérez-vous votre ObjectMappers manuellement, ou utilisez-vous-les dans un paramètre JAX-RS, injecté dans Spring, ou quoi?

0
ptomli