Jackson figyelmen kívül hagyja a Marshalling tulajdonságait

1. Áttekintés

Ez az oktatóanyag megmutatja, hogyan kell hagyjon figyelmen kívül bizonyos mezőket, amikor egy objektumot sorosít a JSON-hoz a Jackson 2.x használatával.

Ez nagyon hasznos, ha a Jackson alapértelmezett értékei nem elegendőek, és pontosan ellenőriznünk kell, hogy mi kerül sorosításra a JSON-ra - és a tulajdonságok figyelmen kívül hagyására többféle lehetőség is van.

Ha mélyebbre akarsz ásni, és más jó dolgokat akarsz megismerni, amelyeket a Jackson-szal tehetsz - menj át a Jackson fő oktatóanyagára.

2. Hagyja figyelmen kívül a mezőket osztály szinten

Figyelmen kívül hagyhatunk bizonyos mezőket osztály szinten, a a @JsonIgnoreProperties kommentár és a mezők megadása név szerint:

@JsonIgnoreProperties (value = {"intValue"}) nyilvános osztály MyDto {private String stringValue; private int intValue; privát logikai logikai érték; nyilvános MyDto () {super (); } // a standard beállítók és mérőeszközök nem láthatók}

Most tesztelhetjük, hogy az objektum JSON-ba írása után a mező valóban nem része a kimenetnek:

@Test public void givenFieldIsIgnoredByName_whenDtoIsSerialized_thenCorrect () dobja JsonParseException, IOException {ObjectMapper mapper = new ObjectMapper (); MyDto dtoObject = new MyDto (); Karakterlánc dtoAsString = mapper.writeValueAsString (dtoObject); assertThat (dtoAsString, nem (tartalmazzaString ("intValue"))); }

3. A mező figyelmen kívül hagyása a mező szintjén

A mezőt közvetlenül is figyelmen kívül hagyhatjuk a @JsonIgnore annotáció közvetlenül a pályán:

public class MyDto {private String stringValue; @JsonIgnore private int intValue; privát logikai logikai érték; nyilvános MyDto () {super (); } // a standard beállítók és mérőeszközök nem láthatók}

Most tesztelhetjük, hogy a intValue mező valóban nem része a sorosított JSON kimenetnek:

@Test public void givenFieldIsIgnoredDirectly_whenDtoIsSerialized_thenCorrect () dobja JsonParseException, IOException {ObjectMapper mapper = new ObjectMapper (); MyDto dtoObject = new MyDto (); Karakterlánc dtoAsString = mapper.writeValueAsString (dtoObject); assertThat (dtoAsString, nem (tartalmazzaString ("intValue"))); }

4. Hagyja figyelmen kívül az összes mezőt típus szerint

Végül megtehetjük hagyja figyelmen kívül az összes megadott típusú mezőt a @ használatávalJsonIgnoreType annotáció. Ha irányítjuk a típust, akkor közvetlenül feljegyezhetjük az osztályt:

@JsonIgnoreType nyilvános osztály SomeType {...}

Gyakrabban azonban nem tudjuk irányítani magát az osztályt; ebben az esetben, jól használhatjuk a Jackson mixeket.

Először definiálunk egy MixIn-t arra a típusra, amelyet figyelmen kívül akarunk hagyni, és ezt jegyezzük fel @JsonIgnoreType helyette:

@JsonIgnoreType nyilvános osztály MyMixInForIgnoreType {}

Ezután regisztráljuk azt a mixint, hogy az összeset helyettesítse (és figyelmen kívül hagyja) Húr[] típusok marsallozás közben:

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

Ezen a ponton az összes String tömböt figyelmen kívül hagyják a JSON-ra történő átadás helyett:

@Test public final void givenFieldTypeIsIgnored_whenDtoIsSerialized_thenCorrect () dobja JsonParseException, IOException {ObjectMapper mapper = new ObjectMapper (); mapper.addMixIn (String []. osztály, MyMixInForIgnoreType.class); MyDtoWithSpecialField dtoObject = új MyDtoWithSpecialField (); dtoObject.setBooleanValue (true); Karakterlánc dtoAsString = mapper.writeValueAsString (dtoObject); assertThat (dtoAsString, tartalmazString ("intValue")); assertThat (dtoAsString, tartalmazString ("booleanValue")); assertThat (dtoAsString, nem (tartalmazzaString ("stringValue"))); }

és itt van a DTO:

public class MyDtoWithSpecialField {private String [] stringValue; private int intValue; privát logikai logikai érték; }

Megjegyzés: A 2.5-ös verzió óta - úgy tűnik, hogy nem használhatjuk ezt a módszert a primitív adattípusok figyelmen kívül hagyására, de egyéni adattípusokhoz és tömbökhöz használhatjuk.

5. Hagyja figyelmen kívül a mezőket a szűrők használatával

Végül, szűrőket is használhatunk bizonyos mezők figyelmen kívül hagyására Jacksonban. Először meg kell határoznunk a szűrőt a Java objektumon:

@JsonFilter ("myFilter") nyilvános osztály MyDtoWithFilter {...}

Ezután meghatározunk egy egyszerű szűrőt, amely figyelmen kívül hagyja a intValue terület:

SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter .serializeAllExcept ("intValue"); FilterProvider szűrők = new SimpleFilterProvider () .addFilter ("myFilter", theFilter);

Most sorosíthatjuk az objektumot, és ellenőrizhetjük, hogy a intValue mező nincs a JSON kimenetben:

@Test public final void givenTypeHasFilterThatIgnoresFieldByName_whenDtoIsSerialized_thenCorrect () dobja JsonParseException, IOException {ObjectMapper mapper = new ObjectMapper (); SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter .serializeAllExcept ("intValue"); FilterProvider szűrők = new SimpleFilterProvider () .addFilter ("myFilter", theFilter); MyDtoWithFilter dtoObject = új MyDtoWithFilter (); Karakterlánc dtoAsString = mapper.writer (szűrők) .writeValueAsString (dtoObject); assertThat (dtoAsString, nem (tartalmazzaString ("intValue"))); assertThat (dtoAsString, tartalmazString ("booleanValue")); assertThat (dtoAsString, tartalmazString ("stringValue")); System.out.println (dtoAsString); }

6. Következtetés

A cikk azt szemléltette, hogyan lehet figyelmen kívül hagyni a mezőket a sorozatosításkor - először név szerint, majd közvetlenül és végül - a MixIns-sel figyelmen kívül hagytuk a teljes java típust, és szűrőket használunk a kimenet jobb szabályozásához.

Mindezen példák és kódrészletek megvalósítása megtalálható a GitHub projektemben.