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.