Jackson JSON Visninger
Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:
>> KONTROLLER KURSET1. Oversikt
I denne opplæringen vil vi gå gjennom hvordan du bruker Jackson JSON Views til å serialisere / deserialisere objekter, tilpasse visningene og til slutt - hvordan du begynner å integrere med Spring.
2. Serialiser ved hjelp av JSON-visninger
Først - la oss gå gjennom et enkelt eksempel - serieisere et objekt med @JsonView.
Her er vårt syn:
offentlig klasse Visninger {offentlig statisk klasse Offentlig {}}
Og "Bruker”Enhet:
public class User {public int id; @JsonView (Views.Public.class) offentlig strengnavn; }
La oss nå serieisere en “Bruker”Forekomst ved bruk av vårt syn:
@Test offentlig ugyldig nårUseJsonViewToSerialize_thenCorrect () kaster JsonProcessingException {brukerbruker = ny bruker (1, "John"); ObjectMapper mapper = ny ObjectMapper (); mapper.disable (MapperFeature.DEFAULT_VIEW_INCLUSION); String result = mapper .writerWithView (Views.Public.class) .writeValueAsString (user); assertThat (resultat, inneholderString ("John")); assertThat (resultat, ikke (inneholderString ("1"))); }
Legg merke til hvordan, fordi vi serieres med en bestemt visning aktiv, vi ser bare de riktige feltene blir seriellisert.
Det er også viktig å forstå at - som standard - alle egenskaper som ikke eksplisitt er merket som en del av en visning, er serielliserte. Vi deaktiverer denne oppførselen med det praktiske DEFAULT_VIEW_INCLUSION trekk.
3. Bruk flere JSON-visninger
Neste - la oss se hvordan du bruker flere JSON-visninger - hver har forskjellige felt som i følgende eksempel:
Her må vi se hvor Innvendig strekker Offentlig, med den interne visningen som utvider den offentlige:
offentlig klasse Visninger {offentlig statisk klasse Offentlig {} offentlig statisk klasse Intern utvider Offentlig {}}
Og her er vår enhet “Punkt”Der bare feltene id og Navn er inkludert i Offentlig utsikt:
public class Item {@JsonView (Views.Public.class) public int id; @JsonView (Views.Public.class) public String itemName; @JsonView (Views.Internal.class) public String ownerName; }
Hvis vi bruker Offentlig visning for å serieisere - bare id og Navn vil bli seriellisert til JSON:
@Test offentlig ugyldig nårUsePublicView_thenOnlyPublicSerialized () kaster JsonProcessingException {Item item = new Item (2, "book", "John"); ObjectMapper mapper = ny ObjectMapper (); String result = mapper .writerWithView (Views.Public.class) .writeValueAsString (item); assertThat (resultat, inneholderString ("bok")); assertThat (resultat, inneholderString ("2")); assertThat (resultat, ikke (inneholderString ("John"))); }
Men hvis vi bruker Innvendig for å utføre serialisering, vil alle felt være en del av JSON-utgangen:
@Test offentlig ugyldig nårUseInternalView_thenAllSerialized () kaster JsonProcessingException {Item item = new Item (2, "book", "John"); ObjectMapper mapper = ny ObjectMapper (); String result = mapper .writerWithView (Views.Internal.class) .writeValueAsString (item); assertThat (resultat, inneholderString ("bok")); assertThat (resultat, inneholderString ("2")); assertThat (resultat, inneholderString ("John")); }
4. Deserialiser ved hjelp av JSON-visninger
Nå - la oss se hvordan du bruker JSON Views til å deserialisere objekter - spesielt, a Bruker forekomst:
@Test offentlig ugyldig nårUseJsonViewToDeserialize_thenCorrect () kaster IOException {String json = "{" id ": 1," name ":" John "}"; ObjectMapper mapper = ny ObjectMapper (); Brukerbruker = mapper .readerWithView (Views.Public.class) .forType (User.class) .readValue (json); assertEquals (1, user.getId ()); assertEquals ("John", user.getName ()); }
Legg merke til hvordan vi bruker readerWithView () API for å opprette en Objektleser ved å bruke den gitte visningen.
5. Tilpass JSON-visninger
Neste - la oss se hvordan du tilpasser JSON Views. I neste eksempel - vi vil lage Bruker “Navn”UpperCase i serieresultatet.
Vi vil bruke BeanPropertyWriter og BeanSerializerModifier for å tilpasse vår JSON-visning. Først - her er BeanPropertyWriterUpperCasingWriter å transformere BrukerNavn til store bokstaver:
offentlig klasse UpperCasingWriter utvider BeanPropertyWriter {BeanPropertyWriter _writer; offentlig UpperCasingWriter (BeanPropertyWriter w) {super (w); _writer = w; } @ Override public void serializeAsField (Object bean, JsonGenerator gen, SerializerProvider prov) kaster Unntak {String value = ((User) bean) .name; verdi = (verdi == null)? "": value.toUpperCase (); gen.writeStringField ("navn", verdi); }}
Og her er BeanSerializerModifier for å stille inn Bruker Navn BeanPropertyWriter med vår skikk UpperCasingWriter:
public class MyBeanSerializerModifier utvider BeanSerializerModifier {@Override public List changeProperties (SerializationConfig config, BeanDescription beanDesc, List beanProperties) {for (int i = 0; i <beanProperties.size (); i ++) {BeanPropertyWriter) hvis (writer.getName () == "navn") {beanProperties.set (i, ny UpperCasingWriter (skribent)); }} returner bønneiendommer; }}
Nå - la oss serieisere en Bruker forekomst ved hjelp av den modifiserte Serializer:
@Test offentlig ugyldig nårUseCustomJsonViewToSerialize_thenCorrect () kaster JsonProcessingException {brukerbruker = ny bruker (1, "John"); SerializerFactory serializerFactory = BeanSerializerFactory.instance .withSerializerModifier (ny MyBeanSerializerModifier ()); ObjectMapper mapper = ny ObjectMapper (); mapper.setSerializerFactory (serializerFactory); String result = mapper .writerWithView (Views.Public.class) .writeValueAsString (user); assertThat (resultat, inneholderString ("JOHN")); assertThat (resultat, inneholderString ("1")); }
6. Bruke JSON-visninger med våren
Til slutt - la oss ta en rask titt på bruk av JSON-visninger med Vårramme. Vi kan utnytte @JsonView kommentar for å tilpasse JSON-svaret vårt på API-nivå.
I det følgende eksemplet brukte vi Offentlig visning for å svare:
@JsonView (Views.Public.class) @RequestMapping ("/ items / {id}") public Item getItemPublic (@PathVariable int id) {return ItemManager.getById (id); }
Svaret er:
{"id": 2, "itemName": "book"}
Og da vi brukte Innvendig se som følger:
@JsonView (Views.Internal.class) @RequestMapping ("/ items / internal / {id}") public Item getItemInternal (@PathVariable int id) {return ItemManager.getById (id); }
Det var svaret:
{"id": 2, "itemName": "book", "ownerName": "John"}
Hvis du vil dykke dypere i å bruke utsikten med Spring 4.1, bør du sjekke Jackson-forbedringene vår 4.1.
7. Konklusjon
I denne raske opplæringen så vi på Jackson JSON-visningene og @JsonView-merknaden. Vi viste hvordan du bruker JSON Views for å ha finkornet kontroll over vår serie- / deserialiseringsprosess - ved hjelp av en eller flere visninger.
Den komplette koden for denne opplæringen finner du på GitHub.
Jackson bunn