Jackson JSON Views
Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:
>> SKONTROLUJTE KURZ1. Prehľad
V tomto výučbe si ukážeme, ako používať Jackson JSON Views na serializáciu / deserializáciu objektov, prispôsobenie pohľadov a nakoniec - ako začať s integráciou s Spring.
2. Serializujte pomocou zobrazení JSON
Najprv - poďme na jednoduchý príklad - serializovať objekt pomocou @JsonView.
Tu je náš názor:
public class Views {public static class Public {}}
A „Používateľ”Entita:
public class User {public int id; @JsonView (Views.Public.class) public Názov reťazca; }
Teraz serializujme „Používateľ”Inštancia pomocou nášho pohľadu:
@ Test public void whenUseJsonViewToSerialize_thenCorrect () vyvolá JsonProcessingException {User user = new User (1, "John"); ObjectMapper mapovač = nový ObjectMapper (); mapper.disable (MapperFeature.DEFAULT_VIEW_INCLUSION); Výsledok reťazca = mapovač .writerWithView (Views.Public.class) .writeValueAsString (užívateľ); assertThat (result, containsString ("John")); assertThat (výsledok, nie (containsString ("1"))); }
Všimnite si, ako to vyzerá, pretože serializujeme s aktívnym konkrétnym zobrazením iba správne polia sa serializujú.
Je tiež dôležité pochopiť, že - štandardne - sú všetky vlastnosti, ktoré nie sú výslovne označené ako súčasť zobrazenia, serializované. Praktické deaktivujeme toto správanie DEFAULT_VIEW_INCLUSION vlastnosť.
3. Použite viac zobrazení JSON
Ďalej - pozrime sa, ako používať viac zobrazení JSON - každé z nich má iné polia ako v nasledujúcom príklade:
Tu musíme mať výhľady kam Interné predlžuje Verejné, s vnútorným pohľadom rozširujúcim verejné:
public class Views {public static class Public {} public static class Internal extends Public {}}
A tu je naša entita “Položka”Kde sú iba polia id a názov sú zahrnuté v Verejné vyhliadka:
public class Item {@JsonView (Views.Public.class) public int id; @JsonView (Views.Public.class) public String itemName; @JsonView (Views.Internal.class) public String ownerName; }
Ak použijeme Verejné pohľad iba na serializáciu id a názov bude serializované na JSON:
@Test public void whenUsePublicView_thenOnlyPublicSerialized () vyvolá JsonProcessingException {Item item = new Item (2, "book", "John"); ObjectMapper mapovač = nový ObjectMapper (); Výsledok reťazca = mapovač .writerWithView (Views.Public.class) .writeValueAsString (položka); assertThat (result, containsString ("kniha")); assertThat (result, containsString ("2")); assertThat (výsledok, nie (containsString ("John"))); }
Ale ak použijeme Interné z pohľadu vykonania serializácie budú všetky polia súčasťou výstupu JSON:
@ Test public void whenUseInternalView_thenAllSerialized () vyvolá JsonProcessingException {Item item = new Item (2, "book", "John"); ObjectMapper mapovač = nový ObjectMapper (); Výsledok reťazca = mapovač .writerWithView (Views.Internal.class) .writeValueAsString (položka); assertThat (result, containsString ("kniha")); assertThat (result, containsString ("2")); assertThat (result, containsString ("John")); }
4. Deserializujte pomocou zobrazení JSON
Teraz - pozrime sa, ako používať zobrazenia JSON na deserializáciu objektov - konkrétne a Používateľ inštancia:
@ Test public void whenUseJsonViewToDeserialize_thenCorrect () vyvolá IOException {String json = "{" id ": 1," name ":" John "}"; ObjectMapper mapovač = nový ObjectMapper (); Používateľ user = mapper .readerWithView (Views.Public.class) .forType (User.class) .readValue (json); assertEquals (1, user.getId ()); assertEquals ("John", user.getName ()); }
Všimnite si, ako používame readerWithView () API na vytvorenie súboru ObjectReader pomocou daného pohľadu.
5. Prispôsobte zobrazenia JSON
Ďalej - pozrime sa, ako prispôsobiť zobrazenia JSON. V nasledujúcom príklade - chceme urobiť Používateľ “názov”UpperCase vo výsledku serializácie.
Použijeme BeanPropertyWriter a BeanSerializerModifier na prispôsobenie nášho zobrazenia JSON. Po prvé - tu je BeanPropertyWriterUpperCasingWriter transformovať Používateľnázov na veľké písmená:
verejná trieda UpperCasingWriter rozširuje BeanPropertyWriter {BeanPropertyWriter _writer; public UpperCasingWriter (BeanPropertyWriter w) {super (w); _pisovateľ = w; } @Override public void serializeAsField (objekt bean, JsonGenerator gen, SerializerProvider prov) vyvolá výnimku {String value = ((User) bean) .name; hodnota = (hodnota == null)? "": value.toUpperCase (); gen.writeStringField ("meno", hodnota); }}
A tu je BeanSerializerModifier nastaviť Používateľ názov BeanPropertyWriter s našim zvykom UpperCasingWriter:
public class MyBeanSerializerModifier extends BeanSerializerModifier {@Override public List changeProperties (SerializationConfig config, BeanDescription beanDesc, List beanProperties) {for (int i = 0; i <beanProperties.size (); i ++) {BeanPropertyWritper writer = beanPropertyWriter writer = biblePropertyWriter if (writer.getName () == "name") {beanProperties.set (i, new UpperCasingWriter (writer)); }} vrátiť beanProperties; }}
Teraz - poďme serializovať a Používateľ inštancia pomocou upraveného Serializátora:
@ Test public void whenUseCustomJsonViewToSerialize_thenCorrect () hodí JsonProcessingException {User user = new User (1, "John"); SerializerFactory serializerFactory = BeanSerializerFactory.instance .withSerializerModifier (nový MyBeanSerializerModifier ()); ObjectMapper mapovač = nový ObjectMapper (); mapper.setSerializerFactory (serializerFactory); Výsledok reťazca = mapovač .writerWithView (Views.Public.class) .writeValueAsString (užívateľ); assertThat (result, containsString ("JOHN")); assertThat (result, containsString ("1")); }
6. Používanie zobrazení JSON s jarou
Nakoniec - poďme sa rýchlo pozrieť na použitie zobrazení JSON s Jarný rámec. Môžeme využiť @JsonView anotácia na prispôsobenie našej odpovede JSON na úrovni API.
V nasledujúcom príklade sme použili Verejné pohľad na odpoveď:
@JsonView (Views.Public.class) @RequestMapping ("/ items / {id}") verejná položka getItemPublic (@PathVariable int id) {návrat ItemManager.getById (id); }
Odpoveď je:
{"id": 2, "itemName": "book"}
A keď sme použili Interné zobraziť takto:
@JsonView (Views.Internal.class) @RequestMapping ("/ items / internal / {id}") verejná položka getItemInternal (@PathVariable int id) {návrat ItemManager.getById (id); }
To bola odpoveď:
{"id": 2, "itemName": "book", "ownerName": "John"}
Ak sa chcete hlbšie ponoriť do používania pohľadov s jarnou verziou 4.1, mali by ste sa pozrieť na vylepšenia od spoločnosti Jackson uvedené na jar 4.1.
7. Záver
V tomto rýchlom návode sme sa pozreli na zobrazenia Jackson JSON a anotáciu @JsonView. Ukázali sme, ako používať zobrazenia JSON na získanie jemnej kontroly nad našim procesom serializácie / deserializácie - pomocou jedného alebo viacerých zobrazení.
Celý kód tohto tutoriálu nájdete na GitHub.
Jackson spodok