Jackson JSON-synspunkter

Jackson Top

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

1. Oversigt

I denne vejledning gennemgår vi, hvordan man bruger Jackson JSON Views til at serialisere / deserialisere objekter, tilpasse visningerne og endelig - hvordan man begynder at integrere med Spring.

2. Serialiser ved hjælp af JSON-visninger

Først - lad os gå igennem et simpelt eksempel - serialisere et objekt med @JsonView.

Her er vores opfattelse:

offentlig klasse Visninger {offentlig statisk klasse Offentlig {}}

Og "Bruger" enhed:

public class User {public int id; @JsonView (Views.Public.class) offentligt strengnavn; }

Lad os nu serialisere en “Bruger”Eksempel ved hjælp af vores opfattelse:

@Test offentlig ugyldigt nårUseJsonViewToSerialize_thenCorrect () kaster JsonProcessingException {Brugerbruger = ny bruger (1, "John"); ObjectMapper-kortlægger = ny ObjectMapper (); mapper.disable (MapperFeature.DEFAULT_VIEW_INCLUSION); String result = mapper .writerWithView (Views.Public.class) .writeValueAsString (user); assertThat (resultat, indeholderString ("John")); assertThat (resultat, ikke (indeholderString ("1"))); }

Bemærk hvordan vi ser det, fordi vi serieliseres med en bestemt visning aktiv kun de rigtige felter serieliseres.

Det er også vigtigt at forstå, at - som standard - alle egenskaber, der ikke udtrykkeligt er markeret som en del af en visning, er serieliserede. Vi deaktiverer denne adfærd med det praktiske DEFAULT_VIEW_INCLUSION funktion.

3. Brug flere JSON-visninger

Næste - lad os se, hvordan du bruger flere JSON-visninger - hver har forskellige felter som i følgende eksempel:

Her skal vi se hvor Indre strækker sig Offentlig, med den interne opfattelse, der udvider den offentlige:

offentlig klasse Visninger {offentlig statisk klasse Offentlig {} offentlig statisk klasse Intern udvider Offentlig {}}

Og her er vores enhed “Vare”Hvor kun markerne id og navn er inkluderet i Offentlig udsigt:

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 bruger Offentlig visning for at serie - kun id og navn vil blive serialiseret til JSON:

@Test offentlig ugyldig nårUsePublicView_thenOnlyPublicSerialized () kaster JsonProcessingException {Item item = new Item (2, "book", "John"); ObjectMapper-kortlægger = ny ObjectMapper (); String result = mapper .writerWithView (Views.Public.class) .writeValueAsString (item); assertThat (resultat, containString ("bog")); assertThat (resultat, indeholderString ("2")); assertThat (resultat, ikke (indeholderString ("John"))); }

Men hvis vi bruger Indre for at udføre serialisering, vil alle felter være en del af JSON-output:

@Test offentlig ugyldig nårUseInternalView_thenAllSerialized () kaster JsonProcessingException {Item item = new Item (2, "book", "John"); ObjectMapper-kortlægger = ny ObjectMapper (); String result = mapper .writerWithView (Views.Internal.class) .writeValueAsString (item); assertThat (resultat, containString ("bog")); assertThat (resultat, indeholderString ("2")); assertThat (resultat, indeholderString ("John")); }

4. Deserialiser ved hjælp af JSON-visninger

Lad os nu se, hvordan man bruger JSON Views til at deserialisere objekter - specifikt a Bruger eksempel:

@Test offentlig ugyldigt, nårUseJsonViewToDeserialize_thenCorrect () kaster IOException {String json = "{" id ": 1," name ":" John "}"; ObjectMapper-kortlægger = ny ObjectMapper (); Brugerbruger = kortlægger .readerWithView (Views.Public.class) .forType (User.class) .readValue (json); assertEquals (1, user.getId ()); assertEquals ("John", user.getName ()); }

Bemærk hvordan vi bruger readerWithView () API til at oprette en ObjectReader ved hjælp af den givne visning.

5. Tilpas JSON-visninger

Næste - lad os se, hvordan du tilpasser JSON-visninger. I det næste eksempel - vi ønsker at lave Brugernavn”UpperCase i serialiseringsresultatet.

Vi bruger BeanPropertyWriter og BeanSerializerModifier for at tilpasse vores JSON-visning. Først - her er BeanPropertyWriterUpperCasingWriter at transformere Brugernavn til store bogstaver:

offentlig klasse UpperCasingWriter udvider BeanPropertyWriter {BeanPropertyWriter _writer; offentlig UpperCasingWriter (BeanPropertyWriter w) {super (w); _writer = w; } @ Override public void serializeAsField (Object bean, JsonGenerator gen, SerializerProvider prov) kaster Undtagelse {String value = ((User) bean) .name; værdi = (værdi == null)? "": value.toUpperCase (); gen.writeStringField ("navn", værdi); }}

Og her er BeanSerializerModifier for at indstille Bruger navn BeanPropertyWriter med vores skik UpperCasingWriter:

public class MyBeanSerializerModifier udvider 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 (forfatter)); }} returner bønnejendomme; }}

Lad os nu serierne a Bruger instans ved hjælp af den modificerede Serializer:

@Test offentlig ugyldigt nårUseCustomJsonViewToSerialize_thenCorrect () kaster JsonProcessingException {Brugerbruger = ny bruger (1, "John"); SerializerFactory serializerFactory = BeanSerializerFactory.instance .withSerializerModifier (ny MyBeanSerializerModifier ()); ObjectMapper-kortlægger = ny ObjectMapper (); mapper.setSerializerFactory (serializerFactory); String result = mapper .writerWithView (Views.Public.class) .writeValueAsString (user); assertThat (resultat, indeholderString ("JOHN")); assertThat (resultat, indeholderString ("1")); }

6. Brug af JSON-udsigter med foråret

Endelig - lad os tage et hurtigt kig på at bruge JSON-visninger med Spring Framework. Vi kan udnytte @JsonView kommentar for at tilpasse vores JSON-svar på API-niveau.

I det følgende eksempel brugte vi Offentlig visning for at 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 brugte Indre 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 dybere ned i brugen af ​​udsigterne med Spring 4.1, skal du tjekke Jackson-forbedringerne i Spring 4.1.

7. Konklusion

I denne hurtige vejledning kiggede vi på Jackson JSON-visningerne og @JsonView-kommentaren. Vi viste, hvordan man bruger JSON Views til at have en finkornet kontrol over vores serie- / deserialiseringsproces - ved hjælp af en enkelt eller flere visninger.

Den komplette kode til denne vejledning kan findes på GitHub.

Jackson bund

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN