Jackson Unmarshalling JSON med ukjente egenskaper

1. Oversikt

I denne artikkelen skal vi ta en titt på unmarshalling-prosessen med Jackson 2.x - spesielt på hvordan håndtere JSON-innhold med ukjente egenskaper.

Hvis du vil grave dypere og lære andre kule ting du kan gjøre med Jackson - gå videre til hovedveiledningen til Jackson.

2. Unmarshall en JSON med flere / ukjente felt

JSON-inngang kommer i alle former og størrelser - og mesteparten av tiden må vi kartlegge den til forhåndsdefinerte Java-objekter med et angitt antall felt. Målet er å rett og slett ignorere alle JSON-egenskaper som ikke kan tilordnes til et eksisterende Java-felt.

La oss for eksempel si at vi må oppheve JSON til følgende Java-enhet:

offentlig klasse MyDto {private String stringValue; privat intValue; privat boolsk boolsk verdi; // standard konstruktør, getters og setters}

2.1. UnrecognizedPropertyException på ukjente felt

Å prøve å fjerne markeringen av en JSON med ukjente egenskaper til denne enkle Java-enheten, vil føre til en com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:

@Test (forventet = UnrecognisedPropertyException.class) offentlig ugyldig gittJsonHasUnknownValues_whenDeserializing_thenException () kaster JsonParseException, JsonMappingException, IOException {String jsonAsString = "{" stringValue ":" a "," int "," int " true, "+" "stringValue2": "noe"} "; ObjectMapper mapper = ny ObjectMapper (); MyDto readValue = mapper.readValue (jsonAsString, MyDto.class); assertNotNull (readValue); }

Dette mislykkes med følgende unntak:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Ukjent felt "stringValue2" (klasse org.baeldung.jackson.ignore.MyDto), ikke merket som uvitende (3 kjente egenskaper: "stringValue", "booleanValue", "intValue" ])

2.2. Håndtere ukjente felt ved hjelp av ObjectMapper

Vi kan nå konfigurere det fulle ObjectMapper for å ignorere ukjente egenskaper i JSON:

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

Vi skal da kunne lese denne typen JSON i en forhåndsdefinert Java-enhet:

@Test offentlig ugyldig gittJsonHasUnknownValuesButJacksonIsIgnoringUnknowns_whenDeserializing_thenCorrect () kaster JsonParseException, JsonMappingException, IOException {String jsonAsString = "{" stringValue ":" a "," "" " ":"noe"}"; ObjectMapper mapper = ny 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. Håndterer ukjente felt på klassenivå

Vi kan også merke en enkelt klasse som å akseptere ukjente felt, i stedet for hele Jackson ObjectMapper:

@JsonIgnoreProperties (ignoreUnknown = true) offentlig klasse MyDtoIgnoreUnknown {...}

Nå skal vi kunne teste den samme oppførselen som før - ukjente felt blir bare ignorert og bare kjente felt blir kartlagt:

@Test offentlig ugyldig gittJsonHasUnknownValuesButIgnoredOnClass_whenDeserializing_thenCorrect () kaster JsonParseException, JsonMappingException, IOException {String jsonAsString = "{" stringValue ":" a "," + "" intValue ":" trueValue: " ":"noe"}"; ObjectMapper mapper = ny 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 en ufullstendig JSON

På samme måte som flere ukjente felt, er det ikke noe problem med Jackson å ikke oppbevare en ufullstendig JSON - en JSON som ikke inneholder alle feltene i Java-klassen:

@Test offentlig ugyldighet gittNotAllFieldsHaveValuesInJson_whenDeserializingAJsonToAClass_thenCorrect () kaster JsonParseException, JsonMappingException, IOException {String jsonAsString = "{" stringValue ":" a "," booleanVal; ObjectMapper mapper = ny ObjectMapper (); MyDto readValue = mapper.readValue (jsonAsString, MyDto.class); assertNotNull (readValue); assertThat (readValue.getStringValue (), equalTo ("a")); assertThat (readValue.isBooleanValue (), equalTo (true)); }

4. Konklusjon

Denne artikkelen dekket deserialisering av en JSON med flere, ukjente egenskaper ved bruk av Jackson.

Dette er en av de vanligste tingene du skal konfigurere når du jobber med Jackson, siden det ofte er tilfellet vi trenger kartlegge JSON-resultater av eksterne REST API-er til en intern Java-representasjon av enhetene til API.

Implementeringen av alle disse eksemplene og kodebiter finner du i GitHub-prosjektet mitt.