Jackson JSON-synspunkter
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 KURSEN1. 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 Bruger “navn”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