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.