Jackson ignorira svojstva marširanja

1. Pregled

Ovaj vodič će pokazati kako zanemari određena polja prilikom serializacije objekta u JSON koristeći Jackson 2.x.

Ovo je vrlo korisno kada zadane postavke Jacksona nisu dovoljne i moramo točno kontrolirati što se serializira u JSON - a postoji nekoliko načina za zanemarivanje svojstava.

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

2. Zanemarite polja na razini predavanja

Koristeći, možemo zanemariti određena polja na razini predavanja @JsonIgnoreProperties napomena i specificiranje polja po imenu:

@JsonIgnoreProperties (value = {"intValue"}) javna klasa MyDto {private String stringValue; private int intValue; private boolean booleanValue; javni MyDto () {super (); } // standardni postavljači i getteri nisu prikazani}

Sada možemo testirati da, nakon što je objekt napisan u JSON, polje zaista nije dio rezultata:

@Test javna praznina givenFieldIsIgnoredByName_whenDtoIsSerialized_thenCorrect () baca JsonParseException, IOException {ObjectMapper mapper = new ObjectMapper (); MyDto dtoObject = novo MyDto (); Niz dtoAsString = mapper.writeValueAsString (dtoObject); assertThat (dtoAsString, ne (sadržiString ("intValue"))); }

3. Zanemari polje na razini polja

Polje također možemo zanemariti izravno putem @JsonIgnore napomena izravno na terenu:

javna klasa MyDto {private String stringValue; @JsonIgnore private int intValue; private boolean booleanValue; javni MyDto () {super (); } // standardni postavljači i getteri nisu prikazani}

Sada možemo testirati da intValue polje doista nije dio serializiranog JSON izlaza:

@Test javna praznina givenFieldIsIgnoredDirectly_whenDtoIsSerialized_thenCorrect () baca JsonParseException, IOException {ObjectMapper mapper = new ObjectMapper (); MyDto dtoObject = novo MyDto (); Niz dtoAsString = mapper.writeValueAsString (dtoObject); assertThat (dtoAsString, ne (sadržiString ("intValue"))); }

4. Zanemari sva polja prema vrsti

Napokon, možemo zanemariti sva polja određene vrste, koristeći @JsonIgnoreType bilješka. Ako kontroliramo tip, tada možemo izravno označiti klasu:

@JsonIgnoreType javna klasa SomeType {...}

Međutim, najčešće nemamo kontrolu nad samim razredom; u ovom slučaju, možemo dobro iskoristiti Jacksonove mješavine.

Prvo definiramo MixIn za vrstu koju bismo željeli zanemariti i to označimo s @JsonIgnoreType umjesto toga:

@JsonIgnoreType javna klasa MyMixInForIgnoreType {}

Zatim registriramo taj mixin da zamjenjuje (i ignorira) sve Niz[] vrste tijekom marširanja:

mapper.addMixInAnnotations (String []. klasa, MyMixInForIgnoreType.class);

U ovom trenutku svi String nizovi će se ignorirati umjesto da se marširaju u JSON:

@Test javna konačna praznina givenFieldTypeIsIgnored_whenDtoIsSerialized_thenCorrect () baca JsonParseException, IOException {ObjectMapper mapper = new ObjectMapper (); mapper.addMixIn (String []. klasa, MyMixInForIgnoreType.class); MyDtoWithSpecialField dtoObject = novo MyDtoWithSpecialField (); dtoObject.setBooleanValue (true); Niz dtoAsString = mapper.writeValueAsString (dtoObject); assertThat (dtoAsString, containsString ("intValue")); assertThat (dtoAsString, containsString ("booleanValue")); assertThat (dtoAsString, ne (sadržiString ("stringValue"))); }

i ovdje je naš DTO:

javna klasa MyDtoWithSpecialField {private String [] stringValue; private int intValue; private boolean booleanValue; }

Napomena: Od verzije 2.5 - čini se da ne možemo koristiti ovu metodu za zanemarivanje primitivnih tipova podataka, ali možemo je koristiti za prilagođene tipove podataka i nizove.

5. Zanemarite polja pomoću filtara

Konačno, filtere također možemo koristiti za ignoriranje određenih polja u Jacksonu. Prvo moramo definirati filtar na Java objektu:

@JsonFilter ("myFilter") javna klasa MyDtoWithFilter {...}

Zatim definiramo jednostavan filtar koji će zanemariti intValue polje:

SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter .serializeAllExcept ("intValue"); FilterProvider filtri = novi SimpleFilterProvider () .addFilter ("myFilter", theFilter);

Sada možemo serializirati objekt i osigurati da intValue polje nije prisutno u JSON izlazu:

@Test javna konačna praznina givenTypeHasFilterThatIgnoresFieldByName_whenDtoIsSerialized_thenCorrect () baca JsonParseException, IOException {ObjectMapper mapper = new ObjectMapper (); SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter .serializeAllExcept ("intValue"); FilterProvider filtri = novi SimpleFilterProvider () .addFilter ("myFilter", theFilter); MyDtoWithFilter dtoObject = novi MyDtoWithFilter (); Niz dtoAsString = mapper.writer (filtri) .writeValueAsString (dtoObject); assertThat (dtoAsString, ne (sadržiString ("intValue"))); assertThat (dtoAsString, containsString ("booleanValue")); assertThat (dtoAsString, containsString ("stringValue")); System.out.println (dtoAsString); }

6. Zaključak

Članak je ilustrirao kako zanemariti polja na serializaciji - prvo po imenu, zatim izravno i na kraju - zanemarili smo cijeli tip Java s MixInsom i koristimo filtere za veću kontrolu rezultata.

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