Jackson je uklonio oznaku JSON s nepoznatim svojstvima

1. Pregled

U ovom ćemo članku pogledati postupak uklanjanja oznaka s Jackson 2.x - posebno na kako postupati sa JSON sadržajem s nepoznatim svojstvima.

Ako želite dublje kopati i naučiti druge cool stvari koje možete raditi s Jacksonom - krenite u glavni Jacksonov tutorial.

2. Demarširajte JSON s dodatnim / nepoznatim poljima

JSON ulaz dolazi u svim oblicima i veličinama - i većinu vremena trebamo ga preslikati na unaprijed definirane Java objekte sa zadanim brojem polja. Cilj je jednostavno zanemarite bilo koja JSON svojstva koja se ne mogu preslikati na postojeće Java polje.

Na primjer, recimo da moramo ukloniti JSON na sljedeći Java entitet:

javna klasa MyDto {private String stringValue; private int intValue; private boolean booleanValue; // standardni konstruktor, getteri i postavljači}

2.1. NeprepoznatiPropertyException na Nepoznatim poljima

Pokušaj uklanjanja JSON-a s nepoznatim svojstvima ovom jednostavnom Java entitetu dovest će do com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:

@Test (očekuje se = UnrecognizedPropertyException.class) javna praznina givenJsonHasUnknownValues_whenDeserializing_thenException () baca JsonParseException, JsonMappingException, IOException {String jsonAsString = "{" string "" "" "" "" "" "" "" "" "" true, "+" "stringValue2": "nešto"} "; Mapa ObjectMapper = novi ObjectMapper (); MyDto readValue = mapper.readValue (jsonAsString, MyDto.class); assertNotNull (readValue); }

To neće uspjeti sa sljedećom iznimkom:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Neprepoznato polje "stringValue2" (klasa org.baeldung.jackson.ignore.MyDto), nije označeno kao zanemarivo (3 poznata svojstva: "stringValue", "booleanValue", "booleanValue" ]))

2.2. Suočavanje s nepoznatim poljima pomoću ObjectMapper

Sada možemo konfigurirati cijeli ObjectMapper zanemariti nepoznata svojstva u JSON-u:

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

Tada bismo trebali moći čitati ovu vrstu JSON-a u unaprijed definirani Java entitet:

@Test public void givenJsonHasUnknownValuesButJacksonIsIgnoringUnknowns_whenDeserializing_thenCorrect () baca JsonParseException, JsonMappingException, IOException {String jsonAsString = "{" stringValueal "," "" "" "" " ":"nešto"}"; ObjectMapper mapper = novi ObjectMapper () .configure (DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); MyDto readValue = mapper.readValue (jsonAsString, MyDto.class); assertNotNull (readValue); assertThat (readValue.getStringValue (), jednakTo ("a")); assertThat (readValue.isBooleanValue (), jednakTo (true)); assertThat (readValue.getIntValue (), jednakTo (1)); }

2.3. Suočavanje s nepoznatim poljima na razini predavanja

Također možemo označiti jedan razred kao prihvaćajući nepoznata polja, umjesto cijelog Jacksona ObjectMapper:

@JsonIgnoreProperties (ignoreUnknown = true) javna klasa MyDtoIgnoreUnknown {...}

Sada bismo trebali moći testirati isto ponašanje kao i prije - nepoznata polja jednostavno se zanemaruju i mapiraju se samo poznata polja:

@Test public void givenJsonHasUnknownValuesButIgnoredOnClass_whenDeserializing_thenCorrect () baca JsonParseException, JsonMappingException, IOException {String jsonAsString = "{" stringValue ":" a "," Vie "" "" "" " ":"nešto"}"; Mapa ObjectMapper = novi ObjectMapper (); MyDtoIgnoreUnknown readValue = mapper .readValue (jsonAsString, MyDtoIgnoreUnknown.class); assertNotNull (readValue); assertThat (readValue.getStringValue (), jednakTo ("a")); assertThat (readValue.isBooleanValue (), jednakTo (true)); assertThat (readValue.getIntValue (), jednakTo (1)); }

3. Demarširajte nepotpuni JSON

Slično dodatnim nepoznatim poljima, uklanjanje oznake nepotpunog JSON-a - JSON-a koji ne sadrži sva polja u Java klasi - nije problem s Jacksonom:

@Test javna praznina givenNotAllFieldsHaveValuesInJson_whenDeserializingAJsonToAClass_thenCorrect () baca JsonParseException, JsonMappingException, IOException {String jsonAsString = "{" stringValue ":" a "boValue": "an" Mapa ObjectMapper = novi ObjectMapper (); MyDto readValue = mapper.readValue (jsonAsString, MyDto.class); assertNotNull (readValue); assertThat (readValue.getStringValue (), jednakTo ("a")); assertThat (readValue.isBooleanValue (), jednakTo (true)); }

4. Zaključak

Ovaj je članak obuhvatio deserializaciju JSON-a s dodatnim, nepoznatim svojstvima, koristeći Jackson.

Ovo je jedna od najčešćih stvari koju treba konfigurirati u radu s Jacksonom, jer je to često slučaj koji nam je potreban preslikati JSON rezultate vanjskih REST API-ja na internu Java predstavu entiteta API-ja.

Implementacija svih ovih primjera i isječaka koda mogu se naći u mom GitHub projektu.


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