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?
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.
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 )
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'.
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 ObjectMapper
s manuellement, ou utilisez-vous-les dans un paramètre JAX-RS, injecté dans Spring, ou quoi?