Jackson Ignorer egenskaber ved Marshalling

1. Oversigt

Denne vejledning viser, hvordan man gør det ignorere visse felter, når du serieliserer et objekt til JSON ved hjælp af Jackson 2.x.

Dette er meget nyttigt, når Jackson-standardindstillingerne ikke er nok, og vi skal kontrollere nøjagtigt, hvad der bliver serialiseret til JSON - og der er flere måder at ignorere egenskaber på.

Hvis du vil grave dybere og lære andre seje ting, kan du gøre med Jackson - gå videre til den vigtigste Jackson-tutorial.

2. Ignorer felter på klasseniveau

Vi kan ignorere specifikke felter på klasseniveau ved hjælp af det @JsonIgnorer ejendomme kommentar og angivelse af felterne ved navn:

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

Vi kan nu teste, at efter at objektet er skrevet til JSON, er feltet faktisk ikke en del af output:

@Test offentlig ugyldighed givenFieldIsIgnoredByName_whenDtoIsSerialized_thenCorrect () kaster JsonParseException, IOException {ObjectMapper mapper = ny ObjectMapper (); MyDto dtoObject = ny MyDto (); String dtoAsString = mapper.writeValueAsString (dtoObject); assertThat (dtoAsString, ikke (indeholderString ("intValue"))); }

3. Ignorer felt på feltniveau

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

offentlig klasse MyDto {private String stringValue; @JsonIgnorer privat int-værdi; privat boolsk boolsk værdi; offentlig MyDto () {super (); } // standard settere og getters vises ikke}

Vi kan nu teste, at intValue felt er faktisk ikke en del af den serielle JSON-output:

@Test offentlig ugyldighed givenFieldIsIgnoredDirectly_whenDtoIsSerialized_thenCorrect () kaster JsonParseException, IOException {ObjectMapper mapper = ny ObjectMapper (); MyDto dtoObject = ny MyDto (); String dtoAsString = mapper.writeValueAsString (dtoObject); assertThat (dtoAsString, ikke (indeholderString ("intValue"))); }

4. Ignorer alle felter efter type

Endelig kan vi ignorere alle felter af en bestemt type ved hjælp af @JsonIgnoreType kommentar. Hvis vi kontrollerer typen, kan vi kommentere klassen direkte:

@JsonIgnoreType offentlig klasse SomeType {...}

Oftere end ikke har vi dog ikke kontrol over selve klassen; I dette tilfælde, vi kan gøre god brug af Jackson mixins.

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

@JsonIgnoreType offentlig klasse MyMixInForIgnoreType {}

Derefter registrerer vi det mixin for at erstatte (og ignorere) alt Snor[] typer under marskalkning:

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

På dette tidspunkt vil alle strengarrays blive ignoreret i stedet for marskaleret til JSON:

@ Test offentlig endelig ugyldighed givenFieldTypeIsIgnored_whenDtoIsSerialized_thenCorrect () kaster JsonParseException, IOException {ObjectMapper mapper = ny ObjectMapper (); mapper.addMixIn (String []. klasse, MyMixInForIgnoreType.class); MyDtoWithSpecialField dtoObject = ny MyDtoWithSpecialField (); dtoObject.setBooleanValue (sand); String dtoAsString = mapper.writeValueAsString (dtoObject); assertThat (dtoAsString, indeholderString ("intValue")); assertThat (dtoAsString, containString ("booleanValue")); assertThat (dtoAsString, ikke (indeholderString ("stringValue"))); }

og her er vores DTO:

offentlig klasse MyDtoWithSpecialField {private String [] stringValue; privat int-værdi; privat boolsk boolsk værdi; }

Bemærk: Siden version 2.5 ser det ud til, at vi ikke kan bruge denne metode til at ignorere primitive datatyper, men vi kan bruge den til brugerdefinerede datatyper og arrays.

5. Ignorer felter ved hjælp af filtre

Langt om længe, Vi kan også bruge filtre til at ignorere bestemte felter i Jackson. Først skal vi definere filteret på Java-objektet:

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

Derefter definerer vi et simpelt filter, der ignorerer intValue Mark:

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

Nu kan vi serieisere objektet og sørge for, at intValue felt findes ikke i JSON-output:

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

6. Konklusion

Artiklen illustrerede, hvordan man ignorerer felter ved serialisering - først ved navn, derefter direkte og til sidst - vi ignorerede hele java-typen med MixIns, og vi bruger filtre til mere kontrol af output.

Implementeringen af ​​alle disse eksempler og kodestykker kan findes i mit GitHub-projekt.