Jackson JSON nézetek

Jackson Top

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 FOLYAMATOT

1. Á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ó

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 FOLYAMATOT