Príklady anotácií Jacksona
1. Prehľad
V tejto príručke sa podrobne ponoríme Jacksonove anotácie.
Uvidíme, ako použiť existujúce anotácie, ako vytvoriť vlastné a nakoniec ako ich deaktivovať.
2. Jacksonove serializačné anotácie
Najskôr sa pozrieme na poznámky o serializácii.
2.1. @JsonAnyGetter
The @JsonAnyGetter anotácia umožňuje flexibilitu použitia a Mapa pole ako štandardné vlastnosti.
Napríklad ExtendableBean subjekt má názov vlastnosť a sada rozšíriteľných atribútov vo forme dvojíc kľúč / hodnota:
public class ExtendableBean {public Názov reťazca; súkromné vlastnosti mapy; @JsonAnyGetter verejná mapa getProperties () {návratové vlastnosti; }}
Keď serializujeme inštanciu tejto entity, dostaneme všetky páry kľúč - hodnota v Mapa štandardne, obyčajné vlastnosti:
{"name": "My bean", "attr2": "val2", "attr1": "val1"}
Takto vyzerá serializácia tejto entity v praxi:
@Test public void whenSerializingUsingJsonAnyGetter_thenCorrect () hodí JsonProcessingException {ExtendableBean bean = new ExtendableBean ("My bean"); bean.add ("attr1", "val1"); bean.add ("attr2", "val2"); Výsledok reťazca = nový ObjectMapper (). WriteValueAsString (fazuľa); assertThat (result, containsString ("attr1")); assertThat (result, containsString ("val1")); }
Môžeme tiež použiť voliteľný argument povolené ako nepravdivé zakázať @JsonAnyGetter (). V takom prípade Mapa budú prevedené ako JSON a zobrazia sa pod vlastnosti premenná po serializácii.
2.2. @JsonGetter
The @JsonGetter anotácia je alternatívou k @JsonProperty anotácia, ktorá označuje metódu ako getrovú metódu.
V nasledujúcom príklade určíme metódu getTheName () ako getrovacia metóda názov majetok a MyBean subjekt:
public class MyBean {public int id; súkromné meno reťazca; @JsonGetter ("meno") public String getTheName () {návratové meno; }}
Takto to funguje v praxi:
@Test public void whenSerializingUsingJsonGetter_thenCorrect () vyvolá JsonProcessingException {MyBean bean = new MyBean (1, "My bean"); Výsledok reťazca = nový ObjectMapper (). WriteValueAsString (fazuľa); assertThat (result, containsString ("My bean")); assertThat (result, containsString ("1")); }
2.3. @JsonPropertyOrder
Môžeme použiť @JsonPropertyOrder anotáciu upresniť poradie vlastností pri serializácii.
Poďme nastaviť vlastné poradie pre vlastnosti a MyBean subjekt:
@JsonPropertyOrder ({"name", "id"}) verejná trieda MyBean {public int id; verejné meno reťazca; }
Tu je výstup serializácie:
{"name": "My bean", "id": 1}
Potom môžeme urobiť jednoduchý test:
@ Test public void whenSerializingUsingJsonPropertyOrder_thenCorrect () vyvolá JsonProcessingException {MyBean bean = new MyBean (1, "My bean"); Výsledok reťazca = nový ObjectMapper (). WriteValueAsString (fazuľa); assertThat (result, containsString ("My bean")); assertThat (result, containsString ("1")); }
Môžeme tiež použiť @JsonPropertyOrder (abecedné = pravda) zoradiť vlastnosti podľa abecedy. V takom prípade bude výstupom serializácie:
{"id": 1, "name": "My bean"}
2.4. @JsonRawValue
The @JsonRawValue anotácia môže dajte Jacksonovi pokyn, aby serializoval vlastnosť presne tak, ako je.
V nasledujúcom príklade používame @JsonRawValue vložiť nejaký vlastný JSON ako hodnotu entity:
public class RawBean {public String name; @JsonRawValue verejný reťazec JSON; }
Výstupom serializácie entity je:
{"name": "My bean", "json": {"attr": false}}
Ďalej je tu jednoduchý test:
@Test public void whenSerializingUsingJsonRawValue_thenCorrect () hodí JsonProcessingException {RawBean bean = new RawBean ("My bean", "{\" attr \ ": false}"); Výsledok reťazca = nový ObjectMapper (). WriteValueAsString (fazuľa); assertThat (result, containsString ("My bean")); assertThat (result, containsString ("{\" attr \ ": false}")); }
Môžeme tiež použiť voliteľný logický argument hodnotu ktorá definuje, či je táto anotácia aktívna alebo nie.
2.5. @JsonValue
@JsonValue označuje jednu metódu, ktorú knižnica použije na serializáciu celej inštancie.
Napríklad v enume anotujeme getName s @JsonValue aby každá takáto entita bola serializovaná pomocou jej názvu:
public enum TypeEnumWithValue {TYPE1 (1, "Type A"), TYPE2 (2, "Type 2"); súkromné celé číslo; súkromné meno reťazca; // štandardné konštruktory @JsonValue public String getName () {návratové meno; }}
Teraz je tu náš test:
@Test public void whenSerializingUsingJsonValue_thenCorrect () hodí JsonParseException, IOException {String enumAsString = new ObjectMapper () .writeValueAsString (TypeEnumWithValue.TYPE1); assertThat (enumAsString, je ("" Typ A "")); }
2.6. @JsonRootName
The @JsonRootName anotácia sa používa, ak je povolené zalamovanie, na určenie názvu koreňového obalu, ktorý sa má použiť.
Zalomenie znamená, že namiesto serializácie a Používateľ na niečo ako:
{"id": 1, "name": "John"}
Bude to zabalené takto:
{"User": {"id": 1, "name": "John"}}
Pozrime sa teda na príklad. Žpoužijem @JsonRootName anotácia označujúca názov tejto potenciálnej obalovej entity:
@JsonRootName (hodnota = "užívateľ") verejná trieda UserWithRoot {verejné int id; verejné meno reťazca; }
V predvolenom nastavení by názov obálky bol názov triedy - UserWithRoot. Použitím anotácie dostaneme vzhľad čističa užívateľ:
@ Test public void whenSerializingUsingJsonRootName_thenCorrect () vyvolá JsonProcessingException {UserWithRoot user = nový používateľ (1, "John"); ObjectMapper mapovač = nový ObjectMapper (); mapper.enable (SerializationFeature.WRAP_ROOT_VALUE); Výsledok reťazca = mapper.writeValueAsString (užívateľ); assertThat (result, containsString ("John")); assertThat (result, containsString ("user")); }
Tu je výstup serializácie:
{"user": {"id": 1, "name": "John"}}
Od verzie Jackson 2.4, nový voliteľný argument menný priestor je k dispozícii na použitie s dátovými formátmi, ako je XML. Ak ho pridáme, stane sa súčasťou plne kvalifikovaného názvu:
@JsonRootName (hodnota = "užívateľ", namespace = "užívatelia") verejná trieda UserWithRootNamespace {public int id; verejné meno reťazca; // ...}
Keby sme to serializovali s XmlMapper, výstup bude:
1 Ján
2.7. @JsonSerialize
@JsonSerialize označuje vlastný serializátor, ktorý sa má použiť, keď zoradenie subjektu.
Pozrime sa na rýchly príklad. Ideme použiť @JsonSerialize na pokračovanie dátum udalosti nehnuteľnosť s a CustomDateSerializer:
public class EventWithSerializer {public String name; @JsonSerialize (using = CustomDateSerializer.class) public Date eventDate; }
Tu je jednoduchý prispôsobený Jacksonov serializátor:
verejná trieda CustomDateSerializer rozširuje StdSerializer {private static SimpleDateFormat formatter = nový SimpleDateFormat ("dd-MM-rrrr hh: mm: ss"); public CustomDateSerializer () {this (null); } public CustomDateSerializer (trieda t) {super (t); } @Override public void serialize (hodnota dátumu, JsonGenerator gen, SerializerProvider arg2) hodí IOException, JsonProcessingException {gen.writeString (formatter.format (hodnota)); }}
Teraz ich použijeme v teste:
@Test public void whenSerializingUsingJsonSerialize_thenCorrect () hodí JsonProcessingException, ParseException {SimpleDateFormat df = new SimpleDateFormat ("dd-MM-rrrr hh: mm: ss"); String toParse = "20-12-2014 02:30:00"; Dátum dátum = df.parse (toParse); EventWithSerializer event = nový EventWithSerializer ("párty", dátum); Výsledok reťazca = nový ObjectMapper (). WriteValueAsString (udalosť); assertThat (result, containsString (toParse)); }
3. Jacksonove deserializačné anotácie
Ďalej sa pozrieme na anotácie Jacksonovej deserializácie.
3.1. @JsonCreator
Môžeme použiť @JsonCreator anotácia na vyladenie konštruktéra / továrne použitej pri deserializácii.
Je to veľmi užitočné, keď potrebujeme deserializovať nejaký JSON, ktorý sa presne nezhoduje s cieľovou entitou, ktorú potrebujeme získať.
Pozrime sa na príklad. Povedzme, že musíme deserializovať nasledujúci JSON:
{"id": 1, "theName": "Moja fazuľa"}
Neexistuje však žiadna názov pole v našej cieľovej entite, existuje iba a názov lúka. Teraz nechceme meniť samotnú entitu, len potrebujeme trochu väčšiu kontrolu nad procesom zjednávania anotovaním konštruktora pomocou @JsonCreator, a pomocou @JsonProperty anotácia tiež:
public class BeanWithCreator {public int id; verejné meno reťazca; @JsonCreator public BeanWithCreator (@JsonProperty ("id") int id, @JsonProperty ("theName") Názov reťazca) {this.id = id; this.name = meno; }}
Uvidíme v akcii:
@ Test public void whenDeserializingUsingJsonCreator_thenCorrect () vyvolá IOException {String json = "{\" id \ ": 1, \" theName \ ": \" My bean \ "}"; BeanWithCreator bean = nový ObjectMapper () .readerFor (BeanWithCreator.class) .readValue (json); assertEquals ("Moja fazuľa", bean.name); }
3.2. @JacksonInject
@JacksonInject označuje, že vlastnosť získa svoju hodnotu z injekcie, a nie z údajov JSON.
V nasledujúcom príklade používame @JacksonInject vložiť majetok id:
public class BeanWithInject {@JacksonInject public int id; verejné meno reťazca; }
Funguje to takto:
@ Test public void whenDeserializingUsingJsonInject_thenCorrect () vyvolá IOException {String json = "{\" name \ ": \" My bean \ "}"; InjectableValues inject = new InjectableValues.Std () .addValue (int.class, 1); BeanWithInject bean = nový ObjectMapper (). Reader (inject) .forType (BeanWithInject.class) .readValue (json); assertEquals ("Moja fazuľa", bean.name); assertEquals (1, bean.id); }
3.3. @JsonAnySetter
@JsonAnySetter nám umožňuje flexibilitu používania a Mapa ako štandardné vlastnosti. Pri deserializácii sa vlastnosti z JSONu jednoducho pridajú na mapu.
Najprv použijeme @JsonAnySetter deserializovať entitu ExtendableBean:
public class ExtendableBean {public Názov reťazca; súkromné vlastnosti mapy; @JsonAnySetter public void add (kľúč reťazca, hodnota reťazca) {properties.put (kľúč, hodnota); }}
Toto je JSON, ktorý musíme deserializovať:
{"name": "My bean", "attr2": "val2", "attr1": "val1"}
Tu je príklad, ako to všetko spolu súvisí:
@ Test public void whenDeserializingUsingJsonAnySetter_thenCorrect () vyvolá IOException {String json = "{\" name \ ": \" My bean \ ", \" attr2 \ ": \" val2 \ ", \" attr1 \ ": \" val1 \ "}"; Fazuľa ExtendableBean = nový ObjectMapper () .readerFor (ExtendableBean.class) .readValue (json); assertEquals ("Moja fazuľa", bean.name); assertEquals ("val2", bean.getProperties (). get ("attr2")); }
3.4. @JsonSetter
@JsonSetter je alternatívou k @JsonProperty ktorá označuje metódu ako metódu setter.
To je neuveriteľne užitočné, keď potrebujeme prečítať nejaké údaje JSON, ale trieda cieľovej entity sa nezhoduje presne s týmito údajmi, a preto musíme vyladiť postup tak, aby vyhovoval.
V nasledujúcom príklade zadáme metódu setTheName () ako zakladateľ spoločnosti názov majetok v našom MyBean subjekt:
public class MyBean {public int id; súkromné meno reťazca; @JsonSetter ("meno") public void setTheName (názov reťazca) {this.name = meno; }}
Teraz, keď potrebujeme zrušiť zdieľanie niektorých údajov JSON, to funguje úplne dobre:
@ Test public void whenDeserializingUsingJsonSetter_thenCorrect () vyvolá IOException {String json = "{\" id \ ": 1, \" name \ ": \" My bean \ "}"; MyBean bean = nový ObjectMapper () .readerFor (MyBean.class) .readValue (json); assertEquals ("Moja fazuľa", bean.getTheName ()); }
3.5. @JsonDeserialize
@JsonDeserialize označuje použitie vlastného deserializátora.
Najprv použijeme @JsonDeserialize rekonštruovať dátum udalosti majetok s CustomDateDeserializer:
public class EventWithSerializer {public String name; @JsonDeserialize (using = CustomDateDeserializer.class) public Date eventDate; }
Tu je vlastný deserializátor:
verejná trieda CustomDateDeserializer rozširuje StdDeserializer {private static SimpleDateFormat formatter = nový SimpleDateFormat ("dd-MM-rrrr hh: mm: ss"); public CustomDateDeserializer () {this (null); } public CustomDateDeserializer (Class vc) {super (vc); } @Override public Date deserialize (JsonParser jsonparser, DeserializationContext context) hodí IOException {String date = jsonparser.getText (); skus {vratit formatter.parse (date); } catch (ParseException e) {throw new RuntimeException (e); }}}
Ďalej je tu test back-to-back:
@Test public void whenDeserializingUsingJsonDeserialize_thenCorrect () hodí IOException {String json = "{" name ":" party "," eventDate ":" 20-12-2014 02:30:00 "}"; SimpleDateFormat df = nový SimpleDateFormat ("dd-MM-rrrr hh: mm: ss"); EventWithSerializer event = nový ObjectMapper () .readerFor (EventWithSerializer.class) .readValue (json); assertEquals ("20-12-2014 02:30:00", df.format (event.eventDate)); }
3.6. @JsonAlias
The @JsonAlias definuje jeden alebo viac alternatívnych mien vlastnosti počas deserializácie.
Pozrime sa, ako táto anotácia funguje, na krátkom príklade:
verejná trieda AliasBean {@JsonAlias ({"fName", "f_name"}) súkromný reťazec firstName; private String priezvisko; }
Tu máme POJO a chceme deserializovať JSON s hodnotami ako napr fName, f_namea krstné meno do krstné meno premenná POJO.
Ďalej uvádzame test, ktorý zaisťuje, aby táto anotácia fungovala podľa očakávania:
@ Test public void whenDeserializingUsingJsonAlias_thenCorrect () vyvolá IOException {String json = "{\" fName \ ": \" John \ ", \" lastName \ ": \" Green \ "}"; AliasBean aliasBean = nový ObjectMapper (). ReaderFor (AliasBean.class) .readValue (json); assertEquals ("John", aliasBean.getFirstName ()); }
4. Anotácie začlenenia majetku Jackson
4.1. @JsonIgnoreProperties
@JsonIgnoreProperties je anotácia na úrovni triedy, ktorá označuje vlastnosť alebo zoznam vlastností, ktoré Jackson bude ignorovať.
Pozrime sa na krátky príklad ignorovania vlastnosti id zo serializácie:
@JsonIgnoreProperties ({"id"}) verejná trieda BeanWithIgnore {public int id; verejné meno reťazca; }
Teraz je tu test, ktorý zaisťuje, že dôjde k ignorovaniu:
@Test public void whenSerializingUsingJsonIgnoreProperties_thenCorrect () hodí JsonProcessingException {BeanWithIgnore bean = new BeanWithIgnore (1, "My bean"); Výsledok reťazca = nový ObjectMapper () .writeValueAsString (fazuľa); assertThat (result, containsString ("My bean")); assertThat (result, not (containsString ("id"))); }
Ak chcete ignorovať všetky neznáme vlastnosti vo vstupe JSON bez výnimky, môžeme nastaviť ignoreUnknown = true z @JsonIgnoreProperties anotácia.
4.2. @JsonIgnore
Naproti tomu @JsonIgnore anotácia sa používa na označenie vlastnosti, ktorá sa má ignorovať na úrovni poľa.
Poďme použiť @JsonIgnore ignorovať vlastnosť id zo serializácie:
public class BeanWithIgnore {@JsonIgnore public int id; verejné meno reťazca; }
Potom vykonáme test, aby sme sa uistili, že id bol úspešne ignorovaný:
@Test public void whenSerializingUsingJsonIgnore_thenCorrect () hodí JsonProcessingException {BeanWithIgnore bean = new BeanWithIgnore (1, "My bean"); Výsledok reťazca = nový ObjectMapper () .writeValueAsString (fazuľa); assertThat (result, containsString ("My bean")); assertThat (result, not (containsString ("id"))); }
4.3. @JsonIgnoreType
@JsonIgnoreType označí všetky vlastnosti anotovaného typu, ktoré sa majú ignorovať.
Pomocou anotácie môžeme označiť všetky vlastnosti typu názov ignorovať:
public class User {public int id; verejné meno meno; @JsonIgnoreType verejná statická trieda Názov {verejný reťazec meno; verejný reťazec priezvisko; }}
Môžeme tiež vyskúšať, či zaistenie funguje správne:
@ Test public void whenSerializingUsingJsonIgnoreType_thenCorrect () hodí JsonProcessingException, ParseException {User.Name name = new User.Name ("John", "Doe"); User user = new User (1, name); Výsledok reťazca = nový ObjectMapper () .writeValueAsString (užívateľ); assertThat (result, containsString ("1")); assertThat (výsledok, nie (containsString ("meno"))); assertThat (výsledok, nie (containsString ("John"))); }
4.4. @JsonInclude
Môžeme použiť @JsonInclude vylúčiť vlastnosti s prázdnymi / nulovými / predvolenými hodnotami.
Pozrime sa na príklad vylučujúci hodnoty null zo serializácie:
@JsonInclude (Include.NON_NULL) verejná trieda MyBean {verejné int id; verejné meno reťazca; }
Celý test:
public void whenSerializingUsingJsonInclude_thenCorrect () hodí JsonProcessingException {MyBean bean = new MyBean (1, null); Výsledok reťazca = nový ObjectMapper () .writeValueAsString (fazuľa); assertThat (result, containsString ("1")); assertThat (výsledok, nie (containsString ("meno"))); }
4.5. @JsonAutoDetect
@JsonAutoDetect môže prepísať predvolenú sémantiku súboru ktoré vlastnosti sú viditeľné a ktoré nie.
Najprv sa pozrime na to, ako môže byť anotácia veľmi užitočná, na jednoduchom príklade; povolme serializáciu súkromných nehnuteľností:
@JsonAutoDetect (fieldVisibility = Visibility.ANY) verejná trieda PrivateBean {private int id; súkromné meno reťazca; }
Potom test:
@Test public void whenSerializingUsingJsonAutoDetect_thenCorrect () hodí JsonProcessingException {PrivateBean bean = new PrivateBean (1, "My bean"); Výsledok reťazca = nový ObjectMapper () .writeValueAsString (fazuľa); assertThat (result, containsString ("1")); assertThat (result, containsString ("My bean")); }
5. Poznámky k manipulácii s polymorfným typom Jacksona
Ďalej sa pozrime na Jacksonove polymorfné typy manipulačných anotácií:
- @JsonTypeInfo - označuje podrobnosti o tom, aké informácie o type majú byť zahrnuté do serializácie
- @JsonSubTypes - označuje podtypy anotovaného typu
- @JsonTypeName - definuje názov logického typu, ktorý sa má použiť pre anotovanú triedu
Pozrime sa na zložitejší príklad a využime všetky tri - @JsonTypeInfo, @JsonSubTypes, a @JsonTypeName - serializovať / deserializovať entitu Zoo:
verejná trieda Zoo {verejné Zvieracie zviera; @JsonTypeInfo (use = JsonTypeInfo.Id.NAME, include = As.PROPERTY, property = "type") @JsonSubTypes ({@ JsonSubTypes.Type (value = Dog.class, name = "dog"), @ JsonSubTypes.Type ( value = Cat.class, name = "cat")}) public static class Animal {public String name; } @JsonTypeName ("dog") verejná statická trieda Pes rozširuje zviera {public double barkVolume; } @JsonTypeName ("cat") verejná statická trieda Cat rozširuje Animal {boolean likesCream; verejné int životy; }}
Keď urobíme serializáciu:
@ Test public void whenSerializingPolymorphic_thenCorrect () vyvolá JsonProcessingException {Zoo.Dog dog = nový Zoo.Dog ("čipkovaný"); Zoo zoo = new Zoo (dog); Výsledok reťazca = nový ObjectMapper () .writeValueAsString (zoo); assertThat (result, containsString ("type")); assertThat (result, containsString ("pes")); }
Tu je pokračovanie Zoo napríklad s pes bude mať za následok:
{"animal": {"type": "dog", "name": "lacy", "barkVolume": 0}}
Teraz k de-serializácii. Začnime s týmto vstupom JSON:
{"animal": {"name": "lacy", "type": "cat"}}
Potom sa pozrime, ako sa to nespraví do a Zoo inštancia:
@ Test public void whenDeserializingPolymorphic_thenCorrect () vyvolá IOException {String json = "{\" animal \ ": {\" name \ ": \" lacy \ ", \" type \ ": \" mačka \ "}}" "; Zoo zoo = new ObjectMapper () .readerFor (Zoo.class) .readValue (json); assertEquals ("čipkované", zoo.animal.name); assertEquals (Zoo.Cat.class, zoo.animal.getClass ()); }
6. Všeobecné poznámky Jacksona
Ďalej si povieme niečo o Jacksonových všeobecnejších anotáciách.
6.1. @JsonProperty
Môžeme pridať the @JsonProperty anotácia na označenie názvu vlastnosti v JSON.
Poďme použiť @JsonProperty serializovať / deserializovať vlastnosť názov keď máme do činenia s neštandardnými gettermi a settermi:
public class MyBean {public int id; súkromné meno reťazca; @JsonProperty ("meno") public void setTheName (názov reťazca) {this.name = meno; } @JsonProperty ("name") public String getTheName () {návratové meno; }}
Ďalej nasleduje náš test:
@ Test public void whenUsingJsonProperty_thenCorrect () vyvolá IOException {MyBean bean = new MyBean (1, "My bean"); Výsledok reťazca = nový ObjectMapper (). WriteValueAsString (fazuľa); assertThat (result, containsString ("My bean")); assertThat (result, containsString ("1")); MyBean resultBean = nový ObjectMapper () .readerFor (MyBean.class) .readValue (výsledok); assertEquals ("Moja fazuľa", resultBean.getTheName ()); }
6.2. @JsonFormat
The @JsonFormat anotácia určuje formát pri serializácii hodnôt dátumu a času.
V nasledujúcom príklade používame @JsonFormat na kontrolu formátu nehnuteľnosti dátum udalosti:
public class EventWithFormat {public Názov reťazca; @JsonFormat (shape = JsonFormat.Shape.STRING, pattern = "dd-MM-rrrr hh: mm: ss") public Date eventDate; }
Potom je tu test:
@Test public void whenSerializingUsingJsonFormat_thenCorrect () hodí JsonProcessingException, ParseException {SimpleDateFormat df = new SimpleDateFormat ("dd-MM-rrrr hh: mm: ss"); df.setTimeZone (TimeZone.getTimeZone ("UTC")); String toParse = "20-12-2014 02:30:00"; Dátum dátum = df.parse (toParse); EventWithFormat event = nový EventWithFormat ("párty", dátum); Výsledok reťazca = nový ObjectMapper (). WriteValueAsString (udalosť); assertThat (result, containsString (toParse)); }
6.3. @JsonUnwrapped
@JsonUnwrapped definuje hodnoty, ktoré by sa mali pri serializácii / deserializácii rozbaliť / zlúčiť.
Pozrime sa presne, ako to funguje; na rozbalenie vlastníctva použijeme anotáciu názov:
public class UnwrappedUser {public int id; @JsonUnwrapped public Meno meno; verejná statická trieda Názov {verejný reťazec meno; verejný reťazec priezvisko; }}
Teraz poďme serializovať inštanciu tejto triedy:
@ Test public void whenSerializingUsingJsonUnwrapped_thenCorrect () vyvolá JsonProcessingException, ParseException {UnwrappedUser.Name name = new UnwrappedUser.Name ("John", "Doe"); UnwrappedUser user = nový UnwrappedUser (1, meno); Výsledok reťazca = nový ObjectMapper (). WriteValueAsString (užívateľ); assertThat (result, containsString ("John")); assertThat (výsledok, nie (containsString ("meno"))); }
Nakoniec tu je výstup, ktorý vyzerá - polia statickej vnorenej triedy rozbalené spolu s druhým poľom:
{"id": 1, "firstName": "John", "lastName": "Doe"}
6.4. @JsonView
@JsonView označuje Pohľad, v ktorom bude vlastnosť zahrnutá pre serializáciu / deserializáciu.
Napríklad použijeme @JsonView serializovať inštanciu Položka subjekt.
Najprv začnime s názormi:
public class Views {public static class Public {} public static class Internal extends Public {}}
Ďalej je tu Položka entita používajúca zobrazenia:
public class Item {@JsonView (Views.Public.class) public int id; @JsonView (Views.Public.class) public String itemName; @JsonView (Views.Internal.class) public String ownerName; }
Nakoniec celý test:
@ Test public void whenSerializingUsingJsonView_thenCorrect () hodí JsonProcessingException {Item item = new Item (2, "book", "John"); Výsledok reťazca = nový ObjectMapper () .writerWithView (Views.Public.class) .writeValueAsString (položka); assertThat (result, containsString ("kniha")); assertThat (result, containsString ("2")); assertThat (výsledok, nie (containsString ("John"))); }
6.5. @JsonManagedReference, @JsonBackReference
The @JsonManagedReference a @JsonBackReference anotácie zvládnu vzťahy rodič - dieťa a obísť slučky.
V nasledujúcom príklade používame @JsonManagedReference a @JsonBackReference serializovať našu ItemWithRef subjekt:
verejná trieda ItemWithRef {public int id; public String itemName; @JsonManagedReference public UserWithRef vlastník; }
Náš UserWithRef subjekt:
public class UserWithRef {public int id; verejné meno reťazca; @JsonBackReference verejný zoznam userItems; }
Potom test:
@ Test public void whenSerializingUsingJacksonReferenceAnnotation_thenCorrect () hodí JsonProcessingException {UserWithRef user = new UserWithRef (1, "John"); ItemWithRef item = nový ItemWithRef (2, „kniha“, používateľ); user.addItem (položka); Výsledok reťazca = nový ObjectMapper (). WriteValueAsString (položka); assertThat (result, containsString ("kniha")); assertThat (result, containsString ("John")); assertThat (výsledok, nie (containsString ("userItems"))); }
6.6. @JsonIdentityInfo
@JsonIdentityInfo naznačuje, že totožnosť objektu by sa mala použiť pri serializácii / deserializácii hodnôt, napríklad pri riešení typov problémov s nekonečnou rekurziou.
V nasledujúcom príklade máme ItemWithIdentity subjekt s obojsmerným vzťahom s UserWithIdentity subjekt:
@JsonIdentityInfo (generátor = ObjectIdGenerators.PropertyGenerator.class, property = "id") verejná trieda ItemWithIdentity {public int id; public String itemName; verejný vlastník UserWithIdentity; }
The UserWithIdentity subjekt:
@JsonIdentityInfo (generátor = ObjectIdGenerators.PropertyGenerator.class, property = "id") verejná trieda UserWithIdentity {public int id; verejné meno reťazca; public List userItems; }
Teraz Pozrime sa, ako je vyriešený problém s nekonečnou rekurziou:
@ Test public void whenSerializingUsingJsonIdentityInfo_thenCorrect () vyvolá JsonProcessingException {UserWithIdentity user = new UserWithIdentity (1, "John"); ItemWithIdentity item = nový ItemWithIdentity (2, „kniha“, používateľ); user.addItem (položka); Výsledok reťazca = nový ObjectMapper (). WriteValueAsString (položka); assertThat (result, containsString ("kniha")); assertThat (result, containsString ("John")); assertThat (result, containsString ("userItems")); }
Tu je úplný výstup serializovanej položky a používateľa:
{"id": 2, "itemName": "book", "owner": {"id": 1, "name": "John", "userItems": [2]}}
6.7. @JsonFilter
The @JsonFilter anotácia určuje filter, ktorý sa má použiť počas serializácie.
Najskôr definujeme entitu a ukážeme na filter:
@JsonFilter ("myFilter") verejná trieda BeanWithFilter {public int id; verejné meno reťazca; }
Teraz v úplnom teste definujeme filter, ktorý vylučuje všetky ostatné vlastnosti okrem názov zo serializácie:
@Test public void whenSerializingUsingJsonFilter_thenCorrect () hodí JsonProcessingException {BeanWithFilter bean = new BeanWithFilter (1, "My bean"); FilterProvider filters = new SimpleFilterProvider (). AddFilter ("myFilter", SimpleBeanPropertyFilter.filterOutAllExcept ("name")); Výsledok reťazca = nový ObjectMapper () .writer (filtre) .writeValueAsString (fazuľa); assertThat (result, containsString ("My bean")); assertThat (result, not (containsString ("id"))); }
7. Vlastná Jacksonova anotácia
Ďalej sa pozrime, ako vytvoriť vlastnú Jacksonovu anotáciu. Môžeme využiť @JacksonAnnotationsInside anotácia:
@Retention (RetentionPolicy.RUNTIME) @JacksonAnnotationsInside @JsonInclude (Include.NON_NULL) @JsonPropertyOrder ({"name", "id", "dateCreated"}) public @interface CustomAnnotation {}
Teraz, ak použijeme novú anotáciu na entitu:
@CustomAnnotation verejná trieda BeanWithCustomAnnotation {public int id; verejné meno reťazca; verejné Dátum dátum Vytvorené; }
Vidíme, ako kombinuje existujúce anotácie do jednoduchej vlastnej, ktorú môžeme použiť ako skratku:
@Test public void whenSerializingUsingCustomAnnotation_thenCorrect () hodí JsonProcessingException {BeanWithCustomAnnotation bean = new BeanWithCustomAnnotation (1, "My bean", null); Výsledok reťazca = nový ObjectMapper (). WriteValueAsString (fazuľa); assertThat (result, containsString ("My bean")); assertThat (result, containsString ("1")); assertThat (result, not (containsString ("dateCreated"))); }
Výstup procesu serializácie:
{"name": "My bean", "id": 1}
8. Jackson MixIn Anotácie
Ďalej sa pozrieme, ako používať anotácie Jackson MixIn.
Použijme napríklad anotácie MixIn na ignorovanie vlastností typu Používateľ:
public class Item {public int id; public String itemName; verejný vlastník používateľa; }
@JsonIgnoreType verejná trieda MyMixInForIgnoreType {}
Potom sa pozrime na toto:
@ Test public void whenSerializingUsingMixInAnnotation_thenCorrect () hodí JsonProcessingException {Item item = new Item (1, "book", null); Výsledok reťazca = nový ObjectMapper (). WriteValueAsString (položka); assertThat (result, containsString ("owner")); ObjectMapper mapovač = nový ObjectMapper (); mapper.addMixIn (User.class, MyMixInForIgnoreType.class); result = mapper.writeValueAsString (položka); assertThat (výsledok, nie (containsString ("vlastník"))); }
9. Zakážte Jacksonovu anotáciu
Nakoniec sa pozrime, ako môžeme vypnúť všetky Jacksonove anotácie. Môžeme to urobiť deaktiváciou Funkcia Mapper.USE_ANNOTATIONS ako v nasledujúcom príklade:
@JsonInclude (Include.NON_NULL) @JsonPropertyOrder ({"name", "id"}) verejná trieda MyBean {public int id; verejné meno reťazca; }
Teraz by po deaktivácii anotácií nemali mať žiadny účinok a mali by sa použiť predvolené hodnoty knižnice:
@ Test public void whenDisablingAllAnnotations_thenAllDisabled () vyvolá IOException {MyBean bean = new MyBean (1, null); ObjectMapper mapovač = nový ObjectMapper (); mapper.disable (MapperFeature.USE_ANNOTATIONS); Výsledok reťazca = mapper.writeValueAsString (fazuľa); assertThat (result, containsString ("1")); assertThat (result, containsString ("name")); }
Výsledok serializácie pred zakázaním anotácií:
{"id": 1}
Výsledok serializácie po vypnutí anotácií:
{"id": 1, "name": null}
10. Záver
V tomto článku sme skúmali Jacksonove anotácie, len sme poškriabali povrch takej flexibility, ktorú môžeme získať ich správnym použitím.
Implementáciu všetkých týchto príkladov a útržkov kódu nájdete na GitHub.