Jackson JSON Views

Jackson Top

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ

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

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ

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