Jackson zrušil zdieľanie súborov JSON s neznámymi vlastnosťami

1. Prehľad

V tomto článku sa pozrieme na proces maršovania s Jacksonom 2.x - konkrétne na ako naložiť s obsahom JSON s neznámymi vlastnosťami.

Ak sa chcete prehĺbiť a naučiť sa ďalšie super veci, ktoré môžete s Jacksonom robiť, choďte na hlavný Jacksonov tutoriál.

2. Zrušte zdieľanie JSON s ďalšími / neznámymi poľami

Vstup JSON má všetky tvary a veľkosti - a väčšinou ho musíme mapovať na preddefinované objekty Java so stanoveným počtom polí. Cieľom je jednoducho ignorujte všetky vlastnosti JSON, ktoré nie je možné mapovať na existujúce pole Java.

Povedzme napríklad, že musíme zrušiť zaradenie JSON do nasledujúcej entity Java:

verejná trieda MyDto {private String stringValue; private int intValue; private boolean booleanValue; // štandardný konštruktor, getre a setre}

2.1. UnrecognizedPropertyException na Neznámych poliach

Pokus o zrušenie zaradenia súboru JSON s neznámymi vlastnosťami do tejto jednoduchej entity Java povedie k com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:

@Test (expect = UnrecognizedPropertyException.class) public void givenJsonHasUnknownValues_whenDeserializing_thenException () vyvolá JsonParseException, JsonMappingException, IOException {String jsonAsString = "{" stringValue ":" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "z" true, "+" "stringValue2": "niečo"} "; ObjectMapper mapovač = nový ObjectMapper (); MyDto readValue = mapper.readValue (jsonAsString, MyDto.class); assertNotNull (readValue); }

To sa nepodarí s nasledujúcou výnimkou:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Nerozpoznané pole „stringValue2“ (trieda org.baeldung.jackson.ignore.MyDto), neznačené ako ignorovateľné (3 známe vlastnosti: „stringValue“, „booleanValue“, „intValue“ ])

2.2. Zaoberanie sa neznámymi poľami pomocou ObjectMapper

Teraz môžeme nakonfigurovať celý ObjectMapper ignorovať neznáme vlastnosti v JSON:

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

Potom by sme mali byť schopní načítať tento druh JSON do preddefinovanej entity Java:

@Test public void givenJsonHasUnknownValuesButJacksonIsIgnoringUnknowns_whenDeserializing_thenCorrect () vyvolá JsonParseException, JsonMappingException, IOException {String jsonAsString = "{" stringValue ":" a "," + "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "", "" ":" niečo "}"; ObjectMapper mapovač = nový 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. Zaoberanie sa neznámymi poľami na úrovni triedy

Môžeme tiež označiť jednu triedu ako prijímajúcu neznáme polia, namiesto celého Jacksona ObjectMapper:

@JsonIgnoreProperties (ignoreUnknown = true) verejná trieda MyDtoIgnoreUnknown {...}

Teraz by sme mali byť schopní otestovať rovnaké správanie ako predtým - neznáme polia sa jednoducho ignorujú a mapujú sa iba známe polia:

@Test public void givenJsonHasUnknownValuesButIgnoredOnClass_whenDeserializing_thenCorrect () vyvolá JsonParseException, JsonMappingException, IOException {String jsonAsString = "{" stringValue ":" a "," + "" intValue ":" "" ":" niečo "}"; ObjectMapper mapovač = nový ObjectMapper (); MyDtoIgnoreUnknown readValue = mapovač .readValue (jsonAsString, MyDtoIgnoreUnknown.class); assertNotNull (readValue); assertThat (readValue.getStringValue (), equalTo ("a")); assertThat (readValue.isBooleanValue (), equalTo (true)); assertThat (readValue.getIntValue (), equalTo (1)); }

3. Zrušte zdieľanie neúplného JSON

Podobne ako v prípade ďalších neznámych polí, zrušenie zdieľania neúplného JSON - JSON, ktorý neobsahuje všetky polia v triede Java - nie je pre Jacksona problém:

@Test public void givenNotAllFieldsHaveValuesInJson_whenDeserializingAJsonToAClass_thenCorrect () hodí JsonParseException, JsonMappingException, IOException {String jsonAsString = "{" stringValue ":" a "," booleanValue ObjectMapper mapovač = nový ObjectMapper (); MyDto readValue = mapper.readValue (jsonAsString, MyDto.class); assertNotNull (readValue); assertThat (readValue.getStringValue (), equalTo ("a")); assertThat (readValue.isBooleanValue (), equalTo (true)); }

4. Záver

Tento článok sa zaoberal deserializáciou súboru JSON s ďalšími, neznámymi vlastnosťami pomocou nástroja Jackson.

Toto je jedna z najbežnejších vecí, ktorú je potrebné nakonfigurovať pri práci s Jacksonom, pretože je to tak často namapujte výsledky JSON externých rozhraní REST API na internú reprezentáciu jazyka Java subjektov API.

Implementáciu všetkých týchto príkladov a útržkov kódu nájdete v mojom projekte GitHub.