您好,登錄后才能下訂單哦!
如何使用@JacksonInject與@JsonAlias注解,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
下面繼續(xù)為大家介紹在JSON反序列化過程中,如何使用@JacksonInject
注解和@JsonAlias
注解
@JacksonInject
注解在使用JSON格式進行反序列化的時候,我們經(jīng)常有這樣一些需求。我們從客戶端或者其他渠道獲取了一個JSON格式的數(shù)據(jù)對象,該對象包含若干個屬性。但是我們在將JSON字符串反序列化的時候,需要給它加上一些默認數(shù)據(jù),比如:
responseTime數(shù)據(jù)響應時間,賦值為當前時間即可;
數(shù)據(jù)反序列化的操作人,賦值為系統(tǒng)當前用戶等
客戶端返回給我們的數(shù)據(jù)本身不會攜帶這些附加信息,這個時候我們就可以使用JacksonInject注解,在JSON字符串反序列化為對象的時候,加上這些附加信息。下面是JacksonInject使用方法
[@Data](https://my.oschina.net/difrik) public class PlayerStar { private String name; private Integer age; private String[] hobbies; //業(yè)余愛好,數(shù)組 private List<String> friends; // 朋友 private Map<String, BigDecimal> salary; //年收入 Map @JacksonInject("responseTime") //注意這里 private LocalDateTime responseTime; }
我們來測試一下反序列化的過程,需要注意的是下文中的jsonInString中并不攜帶responseTime信息,是我們自己在反序列化的時候注入到java對象中的。
[@Test](https://my.oschina.net/azibug) void testJSON2Object() throws IOException { //為responseTime賦值為當前值 InjectableValues.Std iv = new InjectableValues.Std(); iv.addValue("responseTime", LocalDateTime.now()); ObjectMapper mapper = new ObjectMapper(); mapper.setInjectableValues(iv); //將可插入值,在反序列化過程中賦值給對象 //將JSON字符串反序列化為java對象 String jsonInString = "{\"name\":\"喬丹\",\"age\":45,\"hobbies\":[\"高爾夫球\",\"棒球\"]}"; PlayerStar jordan = mapper.readValue(jsonInString, PlayerStar.class); System.out.println(jordan); }
最終的反序列化結果,java 對象的toString()方法輸出結果如下,可以看到多出一個responseTime賦值屬性,值為當前時間
PlayerStar(name=喬丹, age=45, hobbies=[高爾夫球, 棒球], friends=null, salary=null, responseTime=2020-09-22T06:41:09.192)
在上文的代碼中,JSON字符串反序列化為對象,使用的是屬性id的方法進行注入的
@JacksonInject("responseTime") //注意這里responseTime為屬性id private LocalDateTime responseTime;
InjectableValues.Std iv = new InjectableValues.Std(); iv.addValue("responseTime", LocalDateTime.now()); //注意這里responseTime為屬性id,而這要統(tǒng)一
除了可以按照屬性id進行數(shù)據(jù)的注入,還可以使用java type數(shù)據(jù)類型進行數(shù)據(jù)注入。這種方法在一個java 類中,多個成員變量數(shù)據(jù)類型重復的時候,比如定義多個LocalDateTime成員變量,用起來就不太方便了。所以還是建議大家使用屬性id的方法進行注入數(shù)據(jù)注入。
@JacksonInject private LocalDateTime responseTime;
InjectableValues.Std iv = new InjectableValues.Std(); iv.addValue(LocalDateTime.class, LocalDateTime.now()); //注意這里LocalDateTime.class
@JsonAlias
注解當我們在開發(fā)過程中,可能在v1.0的版本中我們定義的PlayerStar類(上文)包含name屬性,但是我們用著用著發(fā)現(xiàn)name這個單詞太通用了,在很多的地方都是系統(tǒng)關鍵字;我們希望在v2.0版本中,給這個成員變量換一個名字,叫做starName,或者playerName。但是我們不希望用戶廢棄v1.0的接口。 也就是說我們希望做到多版本兼容,客戶端傳送過來的JSON字符串,可以是name、可以是playerName、可以是starName。我們該怎么做?答案是使用@JsonAlias
注解
@Data public class PlayerStar { @JsonAlias({"starName", "playerName" }) private String name;
下面三種JSON格式數(shù)據(jù)都可以被正確的反序列化為PlayerStar對象,并為name成員變量賦值
String jsonInString = "{\"name\":\"喬丹\",\"age\":45,\"hobbies\":[\"高爾夫球\",\"棒球\"]}"; String jsonInString = "{\"starName\":\"喬丹\",\"age\":45,\"hobbies\":[\"高爾夫球\",\"棒球\"]}"; String jsonInString = "{\"playerName\":\"喬丹\",\"age\":45,\"hobbies\":[\"高爾夫球\",\"棒球\"]}";
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。