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.