Jackson JSON Views

Jackson Top

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ

1. Pregled

U ovom ćemo uputstvu razmotriti kako koristiti Jackson JSON Views za serializaciju / deserializaciju objekata, prilagodbu prikaza i na kraju - kako započeti integraciju s Springom.

2. Serijaliziranje pomoću JSON prikaza

Prvo - prođimo kroz jednostavan primjer - serializirati objekt pomoću @JsonView.

Evo našeg pogleda:

prikazi javne klase {public static class Public {}}

I „Korisnik”Entitet:

javni razred korisnika {javni int id; @JsonView (Views.Public.class) naziv javnog niza; }

Ajmo sada serializirati "Korisnik”Primjera koristeći naš pogled:

@Test public void whenUseJsonViewToSerialize_thenCorrect () baca JsonProcessingException {User user = new User (1, "John"); Mapa ObjectMapper = novi ObjectMapper (); mapper.disable (MapperFeature.DEFAULT_VIEW_INCLUSION); Rezultat niza = mapper .writerWithView (Views.Public.class) .writeValueAsString (korisnik); assertThat (rezultat, sadržiString ("Ivan")); assertThat (rezultat, ne (sadržiString ("1"))); }

Imajte na umu kako, budući da se serializiramo s određenim aktivnim prikazom, to vidimo seriraju se samo prava polja.

Također je važno razumjeti da su - prema zadanim postavkama - sva svojstva koja nisu izričito označena kao dio prikaza serializirana. Onemogućujemo to ponašanje DEFAULT_VIEW_INCLUSION značajka.

3. Upotrijebite više JSON prikaza

Dalje - pogledajmo kako koristiti više JSON prikaza - svaki ima različita polja kao u sljedećem primjeru:

Ovdje moramo pogledati gdje Interno proteže se Javnost, s unutarnjim pogledom koji proširuje javni:

prikazi javne klase {public static class Public {} public static class Internal extends Public {}}

I ovdje je naš entitet “Artikal”Gdje samo polja iskaznica i Ime uključeni su u Javnost pogled:

stavka javne klase {@JsonView (Views.Public.class) public int id; @JsonView (Views.Public.class) javni String itemName; @JsonView (Views.Internal.class) javni String ownerName; }

Ako koristimo Javnost samo za serializaciju iskaznica i Ime bit će serializiran za JSON:

@Test public void whenUsePublicView_thenOnlyPublicSerialized () baca JsonProcessingException {Item item = new Item (2, "book", "John"); Mapa ObjectMapper = novi ObjectMapper (); Rezultat niza = mapper .writerWithView (Views.Public.class) .writeValueAsString (stavka); assertThat (rezultat, sadržiString ("knjiga")); assertThat (rezultat, sadržiString ("2")); assertThat (rezultat, ne (sadržiString ("Ivan"))); }

Ali ako koristimo Interno pogled radi izvođenja serializacije, sva polja bit će dio JSON izlaza:

@Test public void whenUseInternalView_thenAllSerialized () baca JsonProcessingException {Item item = new Item (2, "book", "John"); Mapa ObjectMapper = novi ObjectMapper (); Rezultat niza = mapper .writerWithView (Views.Internal.class) .writeValueAsString (stavka); assertThat (rezultat, sadržiString ("knjiga")); assertThat (rezultat, sadržiString ("2")); assertThat (rezultat, sadržiString ("Ivan")); }

4. Deserijalizirajte pomoću JSON prikaza

Sada - pogledajmo kako koristiti JSON Views za deserializaciju objekata - konkretno, a Korisnik primjer:

@Test public void whenUseJsonViewToDeserialize_thenCorrect () baca IOException {String json = "{" id ": 1," name ":" John "}"; Mapa ObjectMapper = novi ObjectMapper (); Korisnik korisnik = mapper .readerWithView (Views.Public.class) .forType (User.class) .readValue (json); assertEquals (1, user.getId ()); assertEquals ("John", user.getName ()); }

Primijetite kako koristimo readerWithView () API za stvaranje ObjectReader koristeći se datim pogledom.

5. Prilagodite JSON poglede

Dalje - pogledajmo kako prilagoditi JSON poglede. U sljedećem primjeru - želimo napraviti KorisnikIme”UpperCase u rezultatu serializacije.

Koristit ćemo BeanPropertyWriter i BeanSerializerModifier za prilagodbu našeg JSON prikaza. Prvo - ovdje je BeanPropertyWriterUpperCasingWriter transformirati KorisnikIme velikim slovima:

javna klasa UpperCasingWriter proširuje BeanPropertyWriter {BeanPropertyWriter _writer; javni UpperCasingWriter (BeanPropertyWriter w) {super (w); _pisac = w; } @Override public void serializeAsField (Object bean, JsonGenerator gen, SerializerProvider prov) baca iznimku {String value = ((User) bean) .name; vrijednost = (vrijednost == null)? "": value.toUpperCase (); gen.writeStringField ("ime", vrijednost); }}

A ovdje je BeanSerializerModifier za postavljanje Korisnik Ime BeanPropertyWriter s našim običajem UpperCasingWriter:

javna klasa MyBeanSerializerModifier proširuje BeanSerializerModifier {@Override javni popis changeProperties (SerializationConfig config, BeanDescription beanDesc, List beanProperties) {for (int i = 0; i <beanProperties.size (); i ++) {Writer = beanPropertyWriterer if (writer.getName () == "name") {beanProperties.set (i, novi UpperCasingWriter (Writer)); }} return beanProperties; }}

Sada - ajmo serializirati a Korisnik instanca koja koristi modificirani Serializer:

@Test public void whenUseCustomJsonViewToSerialize_thenCorrect () baca JsonProcessingException {User user = new User (1, "John"); SerializerFactory serializerFactory = BeanSerializerFactory.instance .withSerializerModifier (novi MyBeanSerializerModifier ()); Mapa ObjectMapper = novi ObjectMapper (); mapper.setSerializerFactory (serializerFactory); Rezultat niza = mapper .writerWithView (Views.Public.class) .writeValueAsString (korisnik); assertThat (rezultat, sadržiString ("JOHN")); assertThat (rezultat, sadržiString ("1")); }

6. Korištenje JSON pregleda s proljećem

Na kraju - pogledajmo na brzinu korištenje JSON pogleda s Proljetni okvir. Možemo iskoristiti @JsonView napomena za prilagodbu našeg JSON odgovora na razini API-ja.

U sljedećem primjeru - koristili smo Javnost pogled na odgovor:

@JsonView (Views.Public.class) @RequestMapping ("/ items / {id}") javna stavka getItemPublic (@PathVariable int id) {return ItemManager.getById (id); }

Odgovor je:

{"id": 2, "itemName": "book"}

A kad smo koristili Interno pogled na sljedeći način:

@JsonView (Views.Internal.class) @RequestMapping ("/ items / internal / {id}") public Item getItemInternal (@PathVariable int id) {return ItemManager.getById (id); }

To je bio odgovor:

{"id": 2, "itemName": "book", "ownerName": "John"}

Ako želite dublje zaroniti u korištenje pogleda s Spring 4.1, trebali biste provjeriti poboljšanja Jacksona u Spring 4.1.

7. Zaključak

U ovom smo brzom vodiču pogledali poglede Jacksona JSON-a i bilješku @JsonView. Pokazali smo kako koristiti JSON Views da bismo imali preciznu kontrolu nad našim postupkom serializacije / deserializacije - koristeći jedan ili više prikaza.

Kompletni kôd ovog vodiča možete pronaći na GitHubu.

Jackson dno

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ