Jackson JSON nézetek
Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:
>> ELLENŐRIZZE A FOLYAMATOT1. Áttekintés
Ebben az oktatóanyagban áttekintjük, hogyan használhatjuk a Jackson JSON Views-ot az objektumok sorosítására / dezerializálására, a nézetek testreszabására és végül - hogyan kezdjük el integrálni a Spring-et.
2. Sorosítsa a JSON nézetek használatával
Először - nézzünk át egy egyszerű példát - sorosítson egy objektumot @JsonView.
Itt van a véleményünk:
public class Views {public static class Public {}}
És a "Felhasználó”Entitás:
public class Felhasználó {public int id; @JsonView (Views.Public.class) nyilvános karakterlánc neve; }
Most sorosítsunk egyFelhasználó”Példány nézetünket használva:
@Test public void, amikorUUseJsonViewToSerialize_thenCorrect () dobja a JsonProcessingException {User user = new User (1, "John"); ObjectMapper mapper = új ObjectMapper (); mapper.disable (MapperFeature.DEFAULT_VIEW_INCLUSION); Karakterlánc eredménye = mapper .writerWithView (Views.Public.class) .writeValueAsString (felhasználó); assertThat (eredmény, tartalmazzaString ("John")); assertThat (eredmény, nem (tartalmazzaString ("1"))); }
Figyelje meg, hogy mivel látjuk a sorosítást egy adott nézet aktív állapotával, csak a megfelelő mezőket sorosítják.
Fontos megérteni azt is, hogy - alapértelmezés szerint - minden tulajdonság, amelyet nem jelöltek kifejezetten a nézet részeként, sorosítva vannak. A praktikus funkcióval letiltjuk ezt a viselkedést DEFAULT_VIEW_INCLUSION funkció.
3. Használjon több JSON nézetet
Ezután - nézzük meg, hogyan használhat több JSON nézetet - mindegyiknek különböző mezői vannak, mint az alábbi példában:
Itt meg kell nézni, hol Belső kiterjed Nyilvános, amelynek belső nézete kiterjeszti a nyilvánosságot:
public class Views {public static class Public {} public static class Internal kiterjeszti Public {}}
És itt van az entitásunkTétel”Ahol csak a mezők id és név szerepelnek a Nyilvános Kilátás:
public class Item {@JsonView (Views.Public.class) public int id; @JsonView (Views.Public.class) public String itemName; @JsonView (Views.Internal.class) public String tulajdonosNév; }
Ha a Nyilvános csak a sorozatosításhoz id és név soros lesz a JSON-ra:
@Test public void, amikor aUsePublicView_thenOnlyPublicSerialized () dobja a JsonProcessingException {Item item = new Item (2, "book", "John"); ObjectMapper mapper = új ObjectMapper (); Karakterlánc eredménye = mapper .writerWithView (Views.Public.class) .writeValueAsString (elem); assertThat (eredmény, tartalmazzaString ("könyv")); assertThat (eredmény, tartalmazzaString ("2")); assertThat (eredmény, nem (tartalmazzaString ("John"))); }
De ha a Belső A sorozatosítás elvégzéséhez az összes mező a JSON kimenet része lesz:
@Test public void whenUseInternalView_thenAllSerialized () dobja a JsonProcessingException {Item item = new Item (2, "book", "John"); ObjectMapper mapper = új ObjectMapper (); Karakterlánc eredménye = mapper .writerWithView (Views.Internal.class) .writeValueAsString (elem); assertThat (eredmény, tartalmazzaString ("könyv")); assertThat (eredmény, tartalmazzaString ("2")); assertThat (eredmény, tartalmazzaString ("John")); }
4. Dezerializálás a JSON nézetek használatával
Most - nézzük meg, hogyan lehet a JSON View-kat használni az objektumok deszerializálásához - konkrétan a Felhasználó példa:
@Test public void, amikorUUseJsonViewToDeserialize_thenCorrect () dobja az IOException {String json = "{" id ": 1," name ":" John "}"; ObjectMapper mapper = új ObjectMapper (); Felhasználói felhasználó = mapper .readerWithView (Views.Public.class) .forType (User.class) .readValue (json); assertEquals (1, user.getId ()); assertEquals ("John", user.getName ()); }
Vegye figyelembe, hogyan használjuk a readerWithView () API egy ObjectReader az adott nézet felhasználásával.
5. Testreszabhatja a JSON nézeteket
Ezután - nézzük meg, hogyan testreszabhatja a JSON nézeteket. A következő példában - szeretnénk elkészíteni a Felhasználó “név”UpperCase a sorosítási eredményben.
Használni fogjuk BeanPropertyWriter és BeanSerializerModifier a JSON nézet testreszabásához. Először - itt van a BeanPropertyWriterUpperCasingWriter átalakítani a Felhasználónév nagybetűvel:
public class UpperCasingWriter kiterjeszti a BeanPropertyWriter {BeanPropertyWriter _writer; public UpperCasingWriter (BeanPropertyWriter w) {szuper (w); _író = w; } @Orride public void serializeAsField (Object bean, JsonGenerator gen, SerializerProvider prov) dobja a Kivételt {String value = ((Felhasználó) bab) .name; érték = (érték == null)? "": value.toUpperCase (); gen.writeStringField ("név", érték); }}
És itt van a BeanSerializerModifier beállítani a Felhasználó név BeanPropertyWriter szokásunkkal UpperCasingWriter:
public class MyBeanSerializerModifier kiterjeszti a BeanSerializerModifier {@Override public list changeProperties (SerializationConfig config, BeanDescription beanDesc, List beanProperties) {for (int i = 0; i <beanProperties.size (); i ++) {BeanPropeanties (BeanPropeanW; if (író.címNév () == "név") {beanProperties.set (i, új UpperCasingWriter (író)); }} return beanProperties; }}
Most - sorosítsuk a Felhasználó példány a módosított Serializer használatával:
@Test public void, amikorUUCustomJsonViewToSerialize_thenCorrect () dobja a JsonProcessingException {User user = new User (1, "John"); SerializerFactory serializerFactory = BeanSerializerFactory.instance .withSerializerModifier (új MyBeanSerializerModifier ()); ObjectMapper mapper = új ObjectMapper (); mapper.setSerializerFactory (serializerFactory); Karakterlánc eredménye = mapper .writerWithView (Views.Public.class) .writeValueAsString (felhasználó); assertThat (eredmény, tartalmazzaString ("JOHN")); assertThat (eredmény, tartalmazzaString ("1")); }
6. A JSON Views használata tavasszal
Végül - vessünk egy gyors pillantást a JSON nézetek használatára a Tavaszi keret. Kihasználhatjuk a @JsonView kommentár a JSON válaszunk API szintű testreszabásához.
A következő példában - a Nyilvános nézet válaszolni:
@JsonView (Views.Public.class) @RequestMapping ("/ items / {id}") nyilvános elem getItemPublic (@PathVariable int id) {return ItemManager.getById (id); }
A válasz:
{"id": 2, "itemName": "book"}
És amikor használtuk a Belső nézet az alábbiak szerint:
@JsonView (Views.Internal.class) @RequestMapping ("/ items / internal / {id}") public item getItemInternal (@PathVariable int id) {return ItemManager.getById (id); }
Ez volt a válasz:
{"id": 2, "itemName": "book", "ownerName": "John"}
Ha mélyebbre szeretne merülni a nézetek 4.1 tavaszi használatában, akkor nézze meg a Jackson tavaszi fejlesztéseket a 4.1 tavasszal.
7. Következtetés
Ebben a gyors bemutatóban áttekintettük a Jackson JSON nézeteket és a @JsonView kommentárokat. Megmutattuk, hogyan kell használni a JSON nézeteket a sorosítási / deserializálási folyamatunk finom ellenőrzése érdekében - egyetlen vagy több nézet felhasználásával.
Az oktatóanyag teljes kódja megtalálható a GitHub oldalon.
Jackson alsó