Jackson JSON Visninger

Jackson Top

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 KURSET

1. 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 BrukerNavn”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

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 KURSET

$config[zx-auto] not found$config[zx-overlay] not found