Jackson ignoruje vlastnosti pri zaraďovaní

1. Prehľad

Tento návod ukáže, ako na to pri serializácii objektu na JSON ignorovať určité polia pomocou Jackson 2.x.

To je veľmi užitočné, keď Jacksonove predvolené nastavenia nestačia a musíme presne kontrolovať, čo sa serializuje do JSON - a existuje niekoľko spôsobov, ako ignorovať vlastnosti.

Ak sa chcete prehĺbiť a naučiť sa ďalšie super veci, ktoré môžete s Jacksonom robiť, choďte ďalej k hlavnému tutoriálu Jackson.

2. Ignorujte polia na úrovni triedy

Konkrétne polia na úrovni triedy môžeme ignorovať pomocou @JsonIgnoreProperties anotáciu a špecifikáciu polí podľa názvu:

@JsonIgnoreProperties (value = {"intValue"}) verejná trieda MyDto {private String stringValue; private int intValue; private boolean booleanValue; public MyDto () {super (); } // štandardní nastavovatelia a prijímači sa nezobrazia}

Teraz môžeme vyskúšať, že po zapísaní objektu do formátu JSON pole skutočne nie je súčasťou výstupu:

@ Test public void givenFieldIsIgnoredByName_whenDtoIsSerialized_thenCorrect () vyvolá JsonParseException, IOException {ObjectMapper mapper = new ObjectMapper (); MyDto dtoObject = nový MyDto (); Reťazec dtoAsString = mapper.writeValueAsString (dtoObject); assertThat (dtoAsString, nie (containsString ("intValue"))); }

3. Ignorujte pole na úrovni poľa

Môžeme tiež ignorovať pole priamo cez @JsonIgnore anotáciu priamo na poli:

verejná trieda MyDto {private String stringValue; @JsonIgnore private int intValue; private boolean booleanValue; public MyDto () {super (); } // štandardní nastavovatelia a prijímači sa nezobrazia}

Teraz môžeme vyskúšať, že intValue pole skutočne nie je súčasťou serializovaného výstupu JSON:

@ Test public void givenFieldIsIgnoredDirectly_whenDtoIsSerialized_thenCorrect () vyvolá JsonParseException, IOException {ObjectMapper mapper = new ObjectMapper (); MyDto dtoObject = nový MyDto (); Reťazec dtoAsString = mapper.writeValueAsString (dtoObject); assertThat (dtoAsString, nie (containsString ("intValue"))); }

4. Ignorujte všetky polia podľa typu

Nakoniec môžeme ignorovať všetky polia zadaného typu pomocou znaku @JsonIgnoreType anotácia. Ak ovládame typ, potom môžeme triedu anotovať priamo:

@JsonIgnoreType verejná trieda SomeType {...}

Oveľa častejšie však nemáme kontrolu nad triedou samotnou; v tomto prípade, môžeme dobre využiť Jacksonove mixíny.

Najskôr definujeme MixIn pre typ, ktorý by sme chceli ignorovať, a anotujeme to @JsonIgnoreType namiesto toho:

@JsonIgnoreType verejná trieda MyMixInForIgnoreType {}

Potom zaregistrujeme ten mixin, aby sme nahradili (a ignorovali) všetky Reťazec [] typy počas zaraďovania:

mapper.addMixInAnnotations (reťazec []. trieda, MyMixInForIgnoreType.class);

V tomto okamihu budú všetky reťazce typu String ignorované namiesto zaradenia do JSON:

@Test public final void givenFieldTypeIsIgnored_whenDtoIsSerialized_thenCorrect () hodí JsonParseException, IOException {ObjectMapper mapper = new ObjectMapper (); mapper.addMixIn (String []. trieda, MyMixInForIgnoreType.class); MyDtoWithSpecialField dtoObject = nový MyDtoWithSpecialField (); dtoObject.setBooleanValue (true); Reťazec dtoAsString = mapper.writeValueAsString (dtoObject); assertThat (dtoAsString, containsString ("intValue")); assertThat (dtoAsString, containsString ("booleanValue")); assertThat (dtoAsString, nie (containsString ("stringValue"))); }

a tu je náš DTO:

verejná trieda MyDtoWithSpecialField {private String [] stringValue; private int intValue; private boolean booleanValue; }

Poznámka: Od verzie 2.5 - zdá sa, že túto metódu nemôžeme použiť na ignorovanie primitívnych dátových typov, ale môžeme ju použiť pre vlastné dátové typy a polia.

5. Ignorujte polia pomocou filtrov

Nakoniec môžeme tiež použiť filtre na ignorovanie konkrétnych polí v Jackson. Najprv musíme definovať filter na objekte Java:

@JsonFilter ("myFilter") verejná trieda MyDtoWithFilter {...}

Potom definujeme jednoduchý filter, ktorý bude ignorovať intValue lúka:

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

Teraz môžeme objekt serializovať a ubezpečiť sa, že intValue pole nie je vo výstupe JSON:

@Test public final void givenTypeHasFilterThatIgnoresFieldByName_whenDtoIsSerialized_thenCorrect () vyvolá JsonParseException, IOException {ObjectMapper mapper = nový ObjectMapper (); SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter .serializeAllExcept ("intValue"); FilterProvider filters = new SimpleFilterProvider () .addFilter ("myFilter", theFilter); MyDtoWithFilter dtoObject = nový MyDtoWithFilter (); Reťazec dtoAsString = mapper.writer (filtre) .writeValueAsString (dtoObject); assertThat (dtoAsString, nie (containsString ("intValue"))); assertThat (dtoAsString, containsString ("booleanValue")); assertThat (dtoAsString, containsString ("stringValue")); System.out.println (dtoAsString); }

6. Záver

Článok ilustroval, ako ignorovať polia pri serializácii - najskôr podľa názvu, potom priamo a nakoniec - ignorovali sme celý java typ pomocou MixIns a na väčšiu kontrolu nad výstupom používame filtre.

Implementáciu všetkých týchto príkladov a útržkov kódu nájdete v mojom projekte GitHub.


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