Jackson kirakja a JSON-t ismeretlen tulajdonságokkal

1. Áttekintés

Ebben a cikkben egy pillantást vetünk a Jackson 2.x-szel való bontás folyamatára - konkrétan a hogyan lehet kezelni az ismeretlen tulajdonságú JSON-tartalmakat.

Ha mélyebbre akarsz ásni, és további jó dolgokat szeretnél megismerni, amiket Jackson-nal tehetsz - menj át a fő Jackson bemutatóra.

2. Távolítsa el a JSON-t további / ismeretlen mezőkkel

A JSON bemenet minden formában és méretben kapható - és legtöbbször előre meghatározott Java objektumokra kell feltérképeznünk őket, meghatározott számú mezővel. A cél az, hogy egyszerűen figyelmen kívül hagy minden olyan JSON-tulajdonságot, amely nem rendelhető hozzá egy meglévő Java mezőhöz.

Tegyük fel például, hogy le kell szüntetnünk a JSON-ot a következő Java entitásról:

public class MyDto {private String stringValue; private int intValue; privát logikai logikai érték; // szabványos kivitelező, mérőeszközök és beállítók}

2.1. UnrecognizedPropertyException az Ismeretlen mezőkön

Ha megpróbál ismeretlen tulajdonságokkal rendelkező JSON-t ennek az egyszerű Java-entitásnak szétválasztani, a com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:

@Test (várható = UnrecognizedPropertyException.class) public void givenJsonHasUnknownValues_whenDeserializing_thenException () dobja JsonParseException, JsonMappingException, IOException {String jsonAsString = "{" stringValue true, "+" "stringValue2": "valami"} "; ObjectMapper mapper = új ObjectMapper (); MyDto readValue = mapper.readValue (jsonAsString, MyDto.class); assertNotNull (readValue); }

Ez a következő kivétellel meghiúsul:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Felismerhetetlen "stringValue2" mező (org.baeldung.jackson.ignore.MyDto osztály), nem jelölve tudhatatlannak (3 ismert tulajdonság: "stringValue", "booleanValue", "intValue" ])

2.2. Ismeretlen mezők kezelése a ObjectMapper

Most konfigurálhatjuk a teljeset ObjectMapper figyelmen kívül hagyja az ismeretlen tulajdonságokat a JSON-ban:

új ObjectMapper () .configure (DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, hamis)

Ezután képesnek kell lennünk egy ilyen JSON beolvasására egy előre definiált Java entitássá:

@Test public void givenJsonHasUnknownValuesButJacksonIsIgnoringUnknowns_whenDeserializing_thenCorrect () dobja JsonParseException, JsonMappingException, "IOException {String jsonAsString =" "stringValue +": "stringValue +": 1 " ":"valami"}"; ObjectMapper mapper = új ObjectMapper () .configure (DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, hamis); 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. Ismeretlen mezők kezelése osztály szinten

Jelölhetünk egyetlen osztályt ismeretlen mezők elfogadásaként is, az egész Jackson helyett ObjectMapper:

@JsonIgnoreProperties (ignoreUnknown = true) nyilvános osztály MyDtoIgnoreUnknown {...}

Most képesnek kell lennünk arra, hogy teszteljük ugyanazt a viselkedést, mint korábban - az ismeretlen mezőket egyszerűen figyelmen kívül hagyjuk, és csak az ismert mezőket térképezzük fel:

@Test public void givenJsonHasUnknownValuesButIgnoredOnClass_whenDeserializing_thenCorrect () dobja JsonParseException, JsonMappingException, IOException {String jsonAsString = "{" stringValue ":" a "," + "" intV ":"valami"}"; ObjectMapper mapper = új 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. Kihúzza a hiányos JSON-t

Hasonlóan a további ismeretlen mezőkhöz, a hiányos JSON - egy JSON, amely nem tartalmazza a Java osztály összes mezőjét - visszavonása nem jelent problémát Jacksonnál:

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

4. Következtetés

Ez a cikk a JSON további, ismeretlen tulajdonságokkal való deszerializálásáról szólt Jackson használatával.

Ez az egyik leggyakrabban konfigurálható dolog, amikor Jacksonnal dolgozunk, mivel gyakran erre van szükségünk a külső REST API-k JSON-eredményeit hozzárendeli egy belső Java reprezentációhoz az API entitásai közül.

Mindezen példák és kódrészletek megvalósítása megtalálható a GitHub projektemben.


$config[zx-auto] not found$config[zx-overlay] not found