Jackson Unmarshalling von JSON mit unbekannten Eigenschaften

1. Übersicht

In diesem Artikel werden wir uns mit dem Unmarshalling-Prozess mit Jackson 2.x befassen - insbesondere mit dem Umgang mit JSON-Inhalten mit unbekannten Eigenschaften .

Wenn Sie tiefer graben und andere coole Dinge lernen möchten, die Sie mit Jackson tun können, besuchen Sie das Haupt-Tutorial von Jackson.

2. Entfernen Sie einen JSON mit zusätzlichen / unbekannten Feldern

JSON-Eingaben gibt es in allen Formen und Größen - und meistens müssen wir sie vordefinierten Java-Objekten mit einer festgelegten Anzahl von Feldern zuordnen. Das Ziel besteht darin, einfach alle JSON-Eigenschaften zu ignorieren, die keinem vorhandenen Java-Feld zugeordnet werden können .

Angenommen, wir müssen JSON für die folgende Java-Entität aufheben:

public class MyDto { private String stringValue; private int intValue; private boolean booleanValue; // standard constructor, getters and setters }

2.1. UnrecognizedPropertyException für unbekannte Felder

Der Versuch, einen JSON mit unbekannten Eigenschaften für diese einfache Java-Entität zu entfernen, führt zu einer com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException :

@Test(expected = UnrecognizedPropertyException.class) public void givenJsonHasUnknownValues_whenDeserializing_thenException() throws JsonParseException, JsonMappingException, IOException { String jsonAsString = "{"stringValue":"a"," + ""intValue":1," + ""booleanValue":true," + ""stringValue2":"something"}"; ObjectMapper mapper = new ObjectMapper(); MyDto readValue = mapper.readValue(jsonAsString, MyDto.class); assertNotNull(readValue); }

Dies schlägt mit der folgenden Ausnahme fehl:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "stringValue2" (class org.baeldung.jackson.ignore.MyDto), not marked as ignorable (3 known properties: "stringValue", "booleanValue", "intValue"])

2.2. Umgang mit unbekannten Feldern mit dem ObjectMapper

Wir können jetzt den vollständigen ObjectMapper so konfigurieren , dass unbekannte Eigenschaften in JSON ignoriert werden:

new ObjectMapper() .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)

Wir sollten dann in der Lage sein, diese Art von JSON in eine vordefinierte Java-Entität einzulesen:

@Test public void givenJsonHasUnknownValuesButJacksonIsIgnoringUnknowns_whenDeserializing_thenCorrect() throws JsonParseException, JsonMappingException, IOException { String jsonAsString = "{"stringValue":"a"," + ""intValue":1," + ""booleanValue":true," + ""stringValue2":"something"}"; ObjectMapper mapper = new ObjectMapper() .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); MyDto readValue = mapper.readValue(jsonAsString, MyDto.class); assertNotNull(readValue); assertThat(readValue.getStringValue(), equalTo("a")); assertThat(readValue.isBooleanValue(), equalTo(true)); assertThat(readValue.getIntValue(), equalTo(1)); }

2.3. Umgang mit unbekannten Feldern auf Klassenebene

Wir können eine einzelne Klasse anstelle des gesamten Jackson ObjectMapper auch als Akzeptieren unbekannter Felder markieren :

@JsonIgnoreProperties(ignoreUnknown = true) public class MyDtoIgnoreUnknown { ... }

Jetzt sollten wir in der Lage sein, dasselbe Verhalten wie zuvor zu testen - unbekannte Felder werden einfach ignoriert und nur bekannte Felder werden zugeordnet:

@Test public void givenJsonHasUnknownValuesButIgnoredOnClass_whenDeserializing_thenCorrect() throws JsonParseException, JsonMappingException, IOException { String jsonAsString = "{"stringValue":"a"," + ""intValue":1," + ""booleanValue":true," + ""stringValue2":"something"}"; ObjectMapper mapper = new ObjectMapper(); MyDtoIgnoreUnknown readValue = mapper .readValue(jsonAsString, MyDtoIgnoreUnknown.class); assertNotNull(readValue); assertThat(readValue.getStringValue(), equalTo("a")); assertThat(readValue.isBooleanValue(), equalTo(true)); assertThat(readValue.getIntValue(), equalTo(1)); }

3. Unmarshall ein unvollständiges JSON

Ähnlich wie bei weiteren unbekannten Feldern ist das Aufheben der Bereitstellung eines unvollständigen JSON - eines JSON, der nicht alle Felder in der Java-Klasse enthält - bei Jackson kein Problem:

@Test public void givenNotAllFieldsHaveValuesInJson_whenDeserializingAJsonToAClass_thenCorrect() throws JsonParseException, JsonMappingException, IOException { String jsonAsString = "{"stringValue":"a","booleanValue":true}"; ObjectMapper mapper = new ObjectMapper(); MyDto readValue = mapper.readValue(jsonAsString, MyDto.class); assertNotNull(readValue); assertThat(readValue.getStringValue(), equalTo("a")); assertThat(readValue.isBooleanValue(), equalTo(true)); }

4. Fazit

Dieser Artikel befasste sich mit der Deserialisierung eines JSON mit zusätzlichen, unbekannten Eigenschaften unter Verwendung von Jackson.

Dies ist eine der häufigsten Konfigurationen bei der Arbeit mit Jackson, da häufig JSON-Ergebnisse externer REST-APIs einer internen Java-Darstellung der Entitäten der API zugeordnet werden müssen.

Die Implementierung all dieser Beispiele und Codefragmente finden Sie in meinem GitHub-Projekt.