Jackson Ignoriere Eigenschaften beim Marshalling

Jackson ignoriert Eigenschaften beim Marshalling

1. Überblick

Dieses Tutorial zeigt, wie manignore certain fields when serializing an object to JSON mit Jackson 2.x macht.

Dies ist sehr nützlich, wenn die Jackson-Standardeinstellungen nicht ausreichen und wir genau steuern müssen, was in JSON serialisiert wird - und es gibt verschiedene Möglichkeiten, Eigenschaften zu ignorieren.

Wenn Sie tiefer graben und andere coole Dinge lernen möchten, die Sie mit dem Jackson tun können, gehen Sie zuthe main Jackson tutorial.

Weitere Lektüre:

Einführung in den Jackson ObjectMapper

Der Artikel beschreibt Jacksons zentrale ObjectMapper-Klasse, die grundlegende Serialisierung und Deserialisierung sowie die Konfiguration der beiden Prozesse.

Read more

Jackson Streaming API

Ein kurzer Überblick über Jacksons Streaming-API zur Verarbeitung von JSON, einschließlich der Beispiele

Read more

Anleitung zu @JsonFormat in Jackson

Eine schnelle und praktische Anleitung zur Anmerkung @JsonFormat in Jackson.

Read more

2. Felder auf Klassenebene ignorieren

Wir können bestimmte Felder auf Klassenebene mitthe @JsonIgnoreProperties annotation and specifying the fields by name ignorieren:

@JsonIgnoreProperties(value = { "intValue" })
public class MyDto {

    private String stringValue;
    private int intValue;
    private boolean booleanValue;

    public MyDto() {
        super();
    }

    // standard setters and getters are not shown
}

Wir können jetzt testen, ob das Feld nach dem Schreiben des Objekts in JSON tatsächlich nicht Teil der Ausgabe ist:

@Test
public void givenFieldIsIgnoredByName_whenDtoIsSerialized_thenCorrect()
  throws JsonParseException, IOException {

    ObjectMapper mapper = new ObjectMapper();
    MyDto dtoObject = new MyDto();

    String dtoAsString = mapper.writeValueAsString(dtoObject);

    assertThat(dtoAsString, not(containsString("intValue")));
}

3. Feld auf Feldebene ignorieren

Wir können ein Feld auch direkt überthe @JsonIgnore annotation directly on the field ignorieren:

public class MyDto {

    private String stringValue;
    @JsonIgnore
    private int intValue;
    private boolean booleanValue;

    public MyDto() {
        super();
    }

    // standard setters and getters are not shown
}

Wir können jetzt testen, ob das FeldintValuetatsächlich nicht Teil der serialisierten JSON-Ausgabe ist:

@Test
public void givenFieldIsIgnoredDirectly_whenDtoIsSerialized_thenCorrect()
  throws JsonParseException, IOException {

    ObjectMapper mapper = new ObjectMapper();
    MyDto dtoObject = new MyDto();

    String dtoAsString = mapper.writeValueAsString(dtoObject);

    assertThat(dtoAsString, not(containsString("intValue")));
}

4. Ignorieren Sie alle Felder nach Typ

Schließlich können wirignore all fields of a specified type, using the @JsonIgnoreType annotation. Wenn wir den Typ steuern, können wir die Klasse direkt mit Anmerkungen versehen:

@JsonIgnoreType
public class SomeType { ... }

Meistens haben wir jedoch keine Kontrolle über die Klasse selbst. in diesem Fallwe can make good use of Jackson mixins.

Zuerst definieren wir ein MixIn für den Typ, den wir ignorieren möchten, und kommentieren dies stattdessen mit@JsonIgnoreType:

@JsonIgnoreType
public class MyMixInForIgnoreType {}

Dann registrieren wir dieses Mixin, um alleString[]-Typen während des Marshalling zu ersetzen (und zu ignorieren):

mapper.addMixInAnnotations(String[].class, MyMixInForIgnoreType.class);

Zu diesem Zeitpunkt werden alle String-Arrays ignoriert, anstatt in JSON gemarshallt zu werden:

@Test
public final void givenFieldTypeIsIgnored_whenDtoIsSerialized_thenCorrect()
  throws JsonParseException, IOException {

    ObjectMapper mapper = new ObjectMapper();
    mapper.addMixIn(String[].class, MyMixInForIgnoreType.class);
    MyDtoWithSpecialField dtoObject = new MyDtoWithSpecialField();
    dtoObject.setBooleanValue(true);

    String dtoAsString = mapper.writeValueAsString(dtoObject);

    assertThat(dtoAsString, containsString("intValue"));
    assertThat(dtoAsString, containsString("booleanValue"));
    assertThat(dtoAsString, not(containsString("stringValue")));
}

und hier ist unser DTO:

public class MyDtoWithSpecialField {
    private String[] stringValue;
    private int intValue;
    private boolean booleanValue;
}

Hinweis: Seit Version 2.5 können wir diese Methode anscheinend nicht mehr zum Ignorieren primitiver Datentypen verwenden, sondern für benutzerdefinierte Datentypen und Arrays.

5. Felder mit Filtern ignorieren

Schließlichwe can also use filters to ignore specific fields in Jackson. Zuerst müssen wir den Filter für das Java-Objekt definieren:

@JsonFilter("myFilter")
public class MyDtoWithFilter { ... }

Dann definieren wir einen einfachen Filter, der das FeldintValueignoriert:

SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter
  .serializeAllExcept("intValue");
FilterProvider filters = new SimpleFilterProvider()
  .addFilter("myFilter", theFilter);

Jetzt können wir das Objekt serialisieren und sicherstellen, dass das FeldintValue in der JSON-Ausgabe nicht vorhanden ist:

@Test
public final void givenTypeHasFilterThatIgnoresFieldByName_whenDtoIsSerialized_thenCorrect()
  throws JsonParseException, IOException {

    ObjectMapper mapper = new ObjectMapper();
    SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter
      .serializeAllExcept("intValue");
    FilterProvider filters = new SimpleFilterProvider()
      .addFilter("myFilter", theFilter);

    MyDtoWithFilter dtoObject = new MyDtoWithFilter();
    String dtoAsString = mapper.writer(filters).writeValueAsString(dtoObject);

    assertThat(dtoAsString, not(containsString("intValue")));
    assertThat(dtoAsString, containsString("booleanValue"));
    assertThat(dtoAsString, containsString("stringValue"));
    System.out.println(dtoAsString);
}

6. Fazit

Der Artikel zeigte, wie Felder bei der Serialisierung ignoriert werden - zuerst nach Namen, dann direkt und schließlich - wir haben den gesamten Java-Typ mit MixIns ignoriert und wir verwenden Filter, um die Ausgabe besser steuern zu können.

Die Implementierung all dieser Beispiele und Codefragmente finden Sie inmy GitHub project.