Jackson Unmarshalling JSON met onbekende eigenschappen

1. Overzicht

In dit artikel gaan we kijken naar het ongeëvenaarde proces met Jackson 2.x - in het bijzonder op hoe om te gaan met JSON-inhoud met onbekende eigenschappen.

Als je dieper wilt graven en andere coole dingen wilt leren die je met Jackson kunt doen, ga dan naar de belangrijkste Jackson-tutorial.

2. Unmarshall een JSON met aanvullende / onbekende velden

JSON-invoer is er in alle soorten en maten - en meestal moeten we het toewijzen aan vooraf gedefinieerde Java-objecten met een bepaald aantal velden. Het doel is om eenvoudig negeer alle JSON-eigenschappen die niet kunnen worden toegewezen aan een bestaand Java-veld.

Stel dat we JSON bijvoorbeeld moeten unmarshal naar de volgende Java-entiteit:

openbare klasse MyDto {private String stringValue; privé int intValue; privé boolean booleanValue; // standaard constructor, getters en setters}

2.1. UnrecognizedPropertyException op onbekende velden

Als je probeert om een ​​JSON met onbekende eigenschappen te unmarshalen voor deze eenvoudige Java-entiteit, zal dit leiden tot een com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:

@Test (verwacht = UnrecognizedPropertyException.class) public void givenJsonHasUnknownValues_whenDeserializing_thenException () gooit JsonParseException, JsonMappingException, IOException {String jsonAsString = "{" stringValue ":" a ", "Value": "a", "Value ":" a ", "Value" " true, "+" "stringValue2": "iets"} "; ObjectMapper-mapper = nieuwe ObjectMapper (); MyDto readValue = mapper.readValue (jsonAsString, MyDto.class); assertNotNull (readValue); }

Dit zal mislukken met de volgende uitzondering:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "stringValue2" (class org.baeldung.jackson.ignore.MyDto), niet gemarkeerd als negeerbaar (3 bekende eigenschappen: "stringValue", "booleanValue", "intValue" ])

2.2. Omgaan met onbekende velden met behulp van de ObjectMapper

We kunnen nu het volledige configureren ObjectMapper om onbekende eigenschappen in de JSON te negeren:

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

We zouden dan dit soort JSON in een vooraf gedefinieerde Java-entiteit moeten kunnen lezen:

@Test openbare ongeldige gegevenJsonHasUnknownValuesButJacksonIsIgnoringUnknowns_whenDeserializing_thenCorrect () gooit JsonParseException, JsonMappingException, IOException {String jsonAsString = "{" stringValue ":" a "," + "": "stringValue", "true," true ":"iets"}"; ObjectMapper mapper = nieuwe 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. Omgaan met onbekende velden op klassenniveau

We kunnen ook een enkele klasse markeren als het accepteren van onbekende velden, in plaats van de hele Jackson ObjectMapper:

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

Nu zouden we hetzelfde gedrag als voorheen moeten kunnen testen - onbekende velden worden eenvoudigweg genegeerd en alleen bekende velden worden in kaart gebracht:

@Test openbare leegte gegevenJsonHasUnknownValuesButIgnoredOnClass_whenDeserializing_thenCorrect () gooit JsonParseException, JsonMappingException, IOException {String jsonAsString = "{" stringValue ":" a "," + "" intValue ": 1," true, "+" "intValue": 1, string: "true," + "" ":"iets"}"; ObjectMapper-mapper = nieuwe 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 een onvolledige JSON

Net als bij andere onbekende velden, is het ongedaan maken van een onvolledige JSON - een JSON die niet alle velden in de Java-klasse bevat - geen probleem met Jackson:

@Test openbare leegte gegevenNotAllFieldsHaveValuesInJson_whenDeserializingAJsonToAClass_thenCorrect () gooit JsonParseException, JsonMappingException, IOException {String jsonAsString = "{" stringValue ":" a "," boolean} "; ObjectMapper-mapper = nieuwe ObjectMapper (); MyDto readValue = mapper.readValue (jsonAsString, MyDto.class); assertNotNull (readValue); assertThat (readValue.getStringValue (), equalTo ("a")); assertThat (readValue.isBooleanValue (), equalTo (true)); }

4. Conclusie

Dit artikel behandelde het deserialiseren van een JSON met aanvullende, onbekende eigenschappen met behulp van Jackson.

Dit is een van de meest voorkomende dingen om te configureren bij het werken met Jackson, omdat dit vaak het geval is wijs JSON-resultaten van externe REST API's toe aan een interne Java-representatie van de entiteiten van de API.

De implementatie van al deze voorbeelden en codefragmenten is te vinden in mijn GitHub-project.