it-swarm.com.de

Jackson Ändern Sie JsonIgnore dynamisch

Ich habe eine Klasse und es gibt auch Variablen darin. Manchmal möchte ich einige Felder ignorieren und manchmal nicht beim Deserialisieren (möglicherweise auch beim Serialisieren). Wie kann ich das bei Jackson machen?

24
kamaci

Bei der Serialisierung sollte der Blogeintrag " filter properties " hilfreich sein. Die Deserialisierungsseite hat weniger Unterstützung, da das Geschriebene häufiger herausgefiltert werden soll.

Ein möglicher Ansatz ist die Unterklasse JacksonAnnotationIntrospector, die Methode (en) überschreiben, die die Ignorierbarkeit von Methoden (und/oder Feldern) einschätzen, um die gewünschte Logik zu verwenden.

Es kann auch hilfreich sein, wenn Sie ein Beispiel für die praktische Anwendung angeben, d. H. Was und warum Sie versuchen, die Deserialisierung zu verhindern.

20
StaxMan

Möglicherweise möchten Sie JsonViews verwenden (ursprünglich von http://wiki.fasterxml.com/JacksonJsonViews - broken now - Link zum Webarchiv: https://web.archive.org/web/20170831135842/ http://wiki.fasterxml.com/JacksonJsonViews )

Es zitieren:

Definieren von Ansichten bedeutet zunächst das Deklarieren von Klassen. Sie können vorhandene wiederverwenden oder nur falsche Klassen erstellen - sie sind lediglich Ansichtskennungen mit Beziehungsinformationen (das Kind erbt die Ansichtsmitgliedschaft von den Eltern):

 // 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;
  }

Mit solchen Ansichtsdefinitionen würde die Serialisierung folgendermaßen durchgeführt:

 // 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

Sie sollten sich wahrscheinlich die modules -Funktion der letzten Jackson-Versionen ansehen.

Ein möglicher Mechanismus wäre die Verwendung eines BeanDeserializerModifier .

Ich habe nach einem nützlichen Online-Tutorial oder Beispiel gesucht, aber es wird nichts sofort angezeigt. Es kann möglich sein, etwas auszuarbeiten, wenn mehr über Ihren Kontext bekannt ist. Verwalten Sie Ihre ObjectMappers manuell oder verwenden Sie sie in einer JAX-RS-Einstellung, die in Spring injiziert wurde, oder was?

0
ptomli