Jackson Unmarshalling JSON med ukendte egenskaber

1. Oversigt

I denne artikel skal vi se på unmarshalling-processen med Jackson 2.x - specifikt på hvordan man håndterer JSON-indhold med ukendte egenskaber.

Hvis du vil grave dybere og lære andre seje ting, kan du gøre med Jackson - gå videre til hovedvejledningen til Jackson.

2. Unmarshall en JSON med yderligere / ukendte felter

JSON-input kommer i alle former og størrelser - og det meste af tiden er vi nødt til at kortlægge det til foruddefinerede Java-objekter med et bestemt antal felter. Målet er at simpelthen ignorere alle JSON-egenskaber, der ikke kan kortlægges til et eksisterende Java-felt.

Lad os for eksempel sige, at vi skal fjerne JSON til følgende Java-enhed:

offentlig klasse MyDto {private String stringValue; privat int-værdi; privat boolsk boolsk værdi; // standard konstruktør, getters og setter}

2.1. UnrecognisedPropertyException på ukendte felter

Forsøg på at fjerne en JSON med ukendte egenskaber til denne enkle Java-enhed vil føre til en com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:

@Test (forventet = UnrecognizedPropertyException.class) offentligt ugyldigt givetJsonHasUnknownValues_whenDeserializing_thenException () kaster JsonParseException, JsonMappingException, IOException {String jsonAsString = "{" stringValue ":" 1 "" "" "" true, "+" "stringValue2": "noget"} "; ObjectMapper-kortlægger = ny ObjectMapper (); MyDto readValue = mapper.readValue (jsonAsString, MyDto.class); assertNotNull (readValue); }

Dette mislykkes med følgende undtagelse:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Uigenkendt felt "stringValue2" (klasse org.baeldung.jackson.ignore.MyDto), ikke markeret som uvidende (3 kendte egenskaber: "stringValue", "booleanValue", "intValue" ])

2.2. Håndtering af ukendte felter ved hjælp af ObjectMapper

Vi kan nu konfigurere det fulde ObjectMapper at ignorere ukendte egenskaber i JSON:

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

Vi skulle så være i stand til at læse denne type JSON i en foruddefineret Java-enhed:

@Test offentlig ugyldighed givetJsonHasUnknownValuesButJacksonIsIgnoringUnknowns_whenDeserializing_thenCorrect () smider JsonParseException, JsonMappingException, IOException {String jsonAsString = "{" stringValue ":" a "," "" "" " ":"noget"}"; 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åndtering af ukendte felter på klasseniveau

Vi kan også markere en enkelt klasse som accept af ukendte felter, i stedet for hele Jackson ObjectMapper:

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

Nu skal vi kunne teste den samme adfærd som før - ukendte felter ignoreres simpelthen, og kun kendte felter kortlægges:

@Test offentlig ugyldighed givetJsonHasUnknownValuesButIgnoredOnClass_whenDeserializing_thenCorrect () kaster JsonParseException, JsonMappingException, IOException {String jsonAsString = "{" stringValue ":" a "," + "" stringValue ":" intValue ":" ":"noget"}"; ObjectMapper-kortlægger = ny ObjectMapper (); MyDtoIgnoreUnknown readValue = kortlægger .readValue (jsonAsString, MyDtoIgnoreUnknown.class); assertNotNull (readValue); assertThat (readValue.getStringValue (), equalTo ("a")); assertThat (readValue.isBooleanValue (), equalTo (true)); assertThat (readValue.getIntValue (), equalTo (1)); }

3. Fjern en ufuldstændig JSON

På samme måde som yderligere ukendte felter er det ikke et problem med Jackson at undlade at hente en ufuldstændig JSON - en JSON der ikke indeholder alle felterne i Java-klassen:

@Test offentlig ugyldighed givenNotAllFieldsHaveValuesInJson_whenDeserializingAJsonToAClass_thenCorrect () smider JsonParseException, JsonMappingException, IOException {String jsonAsString = "{" stringValue ":" a "," booleanVal; ObjectMapper-kortlægger = ny ObjectMapper (); MyDto readValue = mapper.readValue (jsonAsString, MyDto.class); assertNotNull (readValue); assertThat (readValue.getStringValue (), equalTo ("a")); assertThat (readValue.isBooleanValue (), equalTo (true)); }

4. Konklusion

Denne artikel dækkede deserialisering af en JSON med yderligere ukendte egenskaber ved hjælp af Jackson.

Dette er en af ​​de mest almindelige ting at konfigurere, når du arbejder med Jackson, da det ofte er tilfældet, vi har brug for kortlæg JSON-resultater af eksterne REST API'er til en intern Java-repræsentation af enhederne i API'et.

Implementeringen af ​​alle disse eksempler og kodestykker kan findes i mit GitHub-projekt.