Jackson Ignorer eiendommer på Marshalling

1. Oversikt

Denne opplæringen viser hvordan du gjør det ignorere visse felt når du serialiserer et objekt til JSON ved hjelp av Jackson 2.x.

Dette er veldig nyttig når Jackson-standardene ikke er nok, og vi må kontrollere nøyaktig hva som blir serialisert til JSON - og det er flere måter å ignorere egenskaper på.

Hvis du vil grave dypere og lære andre kule ting du kan gjøre med Jackson - gå videre til hovedveiledningen til Jackson.

2. Ignorer felt på klassenivå

Vi kan ignorere bestemte felt på klassenivå ved hjelp av @JsonIgnore Properties kommentar og spesifisere feltene etter navn:

@JsonIgnoreProperties (value = {"intValue"}) offentlig klasse MyDto {private String stringValue; privat intValue; privat boolsk boolsk verdi; offentlig MyDto () {super (); } // standard settere og getters vises ikke}

Vi kan nå teste at etter at objektet er skrevet til JSON, er feltet faktisk ikke en del av utdataene:

@Test offentlig ugyldighet givenFieldIsIgnoredByName_whenDtoIsSerialized_thenCorrect () kaster JsonParseException, IOException {ObjectMapper mapper = new ObjectMapper (); MyDto dtoObject = ny MyDto (); Streng dtoAsString = mapper.writeValueAsString (dtoObject); assertThat (dtoAsString, ikke (inneholderString ("intValue"))); }

3. Ignorer felt på feltnivå

Vi kan også ignorere et felt direkte via @JsonIgnorer kommentar direkte på feltet:

offentlig klasse MyDto {private String stringValue; @JsonIgnorer privat intValue; privat boolsk boolsk verdi; offentlig MyDto () {super (); } // standard settere og getters vises ikke}

Vi kan nå teste at intValue feltet er faktisk ikke en del av den serieiserte JSON-utgangen:

@Test offentlig ugyldighet givenFieldIsIgnoredDirectly_whenDtoIsSerialized_thenCorrect () kaster JsonParseException, IOException {ObjectMapper mapper = new ObjectMapper (); MyDto dtoObject = ny MyDto (); Streng dtoAsString = mapper.writeValueAsString (dtoObject); assertThat (dtoAsString, ikke (inneholderString ("intValue"))); }

4. Ignorer alle felt etter type

Endelig kan vi ignorere alle felt av en spesifisert type, bruk @JsonIgnoreType kommentar. Hvis vi kontrollerer typen, kan vi kommentere klassen direkte:

@JsonIgnoreType offentlig klasse SomeType {...}

Oftere enn ikke har vi imidlertid ikke kontroll over selve klassen; i dette tilfellet, vi kan gjøre god bruk av Jackson mixins.

Først definerer vi en MixIn for typen vi vil ignorere, og kommenterer den med @JsonIgnoreType i stedet:

@JsonIgnoreType offentlig klasse MyMixInForIgnoreType {}

Så registrerer vi den blandingen for å erstatte (og ignorere) alle Streng [] typer under marshaling:

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

På dette tidspunktet vil alle strengarrayer bli ignorert i stedet for marskalt til JSON:

@Test offentlig endelig ugyldighet givenFieldTypeIsIgnored_whenDtoIsSerialized_thenCorrect () kaster JsonParseException, IOException {ObjectMapper mapper = new ObjectMapper (); mapper.addMixIn (streng []. klasse, MyMixInForIgnoreType.class); MyDtoWithSpecialField dtoObject = ny MyDtoWithSpecialField (); dtoObject.setBooleanValue (true); Streng dtoAsString = mapper.writeValueAsString (dtoObject); assertThat (dtoAsString, containString ("intValue")); assertThat (dtoAsString, containString ("booleanValue")); assertThat (dtoAsString, ikke (inneholderString ("stringValue"))); }

og her er vår DTO:

offentlig klasse MyDtoWithSpecialField {private String [] stringValue; privat intValue; privat boolsk boolsk verdi; }

Merk: Siden versjon 2.5 ser det ut til at vi ikke kan bruke denne metoden til å ignorere primitive datatyper, men vi kan bruke den til egendefinerte datatyper og matriser.

5. Ignorer felt ved hjelp av filtre

Endelig, vi kan også bruke filtre for å ignorere bestemte felt i Jackson. Først må vi definere filteret på Java-objektet:

@JsonFilter ("myFilter") offentlig klasse MyDtoWithFilter {...}

Deretter definerer vi et enkelt filter som vil ignorere intValue felt:

SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter .serializeAllExcept ("intValue"); FilterProvider filters = new SimpleFilterProvider () .addFilter ("myFilter", theFilter);

Nå kan vi serieisere objektet og sørge for at intValue feltet er ikke tilstede i JSON-utgangen:

@Test offentlig endelig ugyldighet givenTypeHasFilterThatIgnoresFieldByName_whenDtoIsSerialized_thenCorrect () kaster JsonParseException, IOException {ObjectMapper mapper = new ObjectMapper (); SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter .serializeAllExcept ("intValue"); FilterProvider filters = new SimpleFilterProvider () .addFilter ("myFilter", theFilter); MyDtoWithFilter dtoObject = ny MyDtoWithFilter (); Streng dtoAsString = mapper.writer (filtre) .writeValueAsString (dtoObject); assertThat (dtoAsString, ikke (inneholderString ("intValue"))); assertThat (dtoAsString, containString ("booleanValue")); assertThat (dtoAsString, containString ("stringValue")); System.out.println (dtoAsString); }

6. Konklusjon

Artikkelen illustrerte hvordan man kan ignorere felt ved serialisering - først etter navn, deretter direkte og til slutt - vi ignorerte hele Java-typen med MixIns, og vi bruker filtre for mer kontroll over utdataene.

Implementeringen av alle disse eksemplene og kodebiter finner du i GitHub-prosjektet mitt.


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