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.