
Jackson是Spring Boot(SpringBoot)默認的JSON資料處理框架,但是其并不依賴于任何的Spring 庫,有的小伙伴以為Jackson只能在Spring框架內使用,其實不是的,沒有這種限制,它提供了很多的JSON資料處理方法、注解,也包括流式API、樹模型、資料系結,以及復雜資料型別轉換等功能,它雖然簡單易用,但絕對不是小玩具,更多的內容我會寫成一個系列,5-10篇文章,請您繼續關注我,
- 《序列化與反序列化核心用法-JSON框架Jackson精解第1篇》
- 《特殊資料格式處理-JSON框架Jackson精解第2篇》
- 《屬性序列化自定義排序與字母表排序-JSON框架Jackson精解第3篇》
本節繼續為大家介紹在JSON反序列化程序中,如何使用@JacksonInject注解和@JsonAlias注解
一、@JacksonInject注解
在使用JSON格式進行反序列化的時候,我們經常有這樣一些需求,我們從客戶端或者其他渠道獲取了一個JSON格式的資料物件,該物件包含若干個屬性,但是我們在將JSON字串反序列化的時候,需要給它加上一些默認資料,比如:
- responseTime資料回應時間,賦值為當前時間即可;
- 資料反序列化的操作人,賦值為系統當前用戶等
客戶端回傳給我們的資料本身不會攜帶這些附加資訊,這個時候我們就可以使用JacksonInject注解,在JSON字串反序列化為物件的時候,加上這些附加資訊,下面是JacksonInject使用方法
@Data
public class PlayerStar {
private String name;
private Integer age;
private String[] hobbies; //業余愛好,陣列
private List<String> friends; // 朋友
private Map<String, BigDecimal> salary; //年收入 Map
@JacksonInject("responseTime") //注意這里
private LocalDateTime responseTime;
}
我們來測驗一下反序列化的程序,需要注意的是下文中的jsonInString中并不攜帶responseTime資訊,是我們自己在反序列化的時候注入到java物件中的,
@Test
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)
二、按照資料型別type進行資料注入
在上文的代碼中,JSON字串反序列化為物件,使用的是屬性id的方法進行注入的
@JacksonInject("responseTime") //注意這里responseTime為屬性id
private LocalDateTime responseTime;
InjectableValues.Std iv = new InjectableValues.Std();
iv.addValue("responseTime", LocalDateTime.now()); //注意這里responseTime為屬性id,而這要統一
除了可以按照屬性id進行資料的注入,還可以使用java type資料型別進行資料注入,這種方法在一個java 類中,多個成員變數資料型別重復的時候,比如定義多個LocalDateTime成員變數,用起來就不太方便了,所以還是建議大家使用屬性id的方法進行注入資料注入,
@JacksonInject
private LocalDateTime responseTime;
InjectableValues.Std iv = new InjectableValues.Std();
iv.addValue(LocalDateTime.class, LocalDateTime.now()); //注意這里LocalDateTime.class
三、 @JsonAlias注解
當我們在開發程序中,可能在v1.0的版本中我們定義的PlayerStar類(上文)包含name屬性,但是我們用著用著發現name這個單詞太通用了,在很多的地方都是系統關鍵字;我們希望在v2.0版本中,給這個成員變數換一個名字,叫做starName,或者playerName,但是我們不希望用戶廢棄v1.0的介面,
也就是說我們希望做到多版本兼容,客戶端傳送過來的JSON字串,可以是name、可以是playerName、可以是starName,我們該怎么做?答案是使用@JsonAlias注解
@Data
public class PlayerStar {
@JsonAlias({"starName", "playerName" })
private String name;
下面三種JSON格式資料都可以被正確的反序列化為PlayerStar物件,并為name成員變數賦值
String jsonInString = "{\"name\":\"喬丹\",\"age\":45,\"hobbies\":[\"高爾夫球\",\"棒球\"]}";
String jsonInString = "{\"starName\":\"喬丹\",\"age\":45,\"hobbies\":[\"高爾夫球\",\"棒球\"]}";
String jsonInString = "{\"playerName\":\"喬丹\",\"age\":45,\"hobbies\":[\"高爾夫球\",\"棒球\"]}";
歡迎關注我的博客,里面有很多精品合集
- 本文轉載注明出處(必須帶連接,不能只轉文字):字母哥博客,
覺得對您有幫助的話,幫我點贊、分享!您的支持是我不竭的創作動力! ,另外,筆者最近一段時間輸出了如下的精品內容,期待您的關注,
- 《手摸手教你學Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《實戰前后端分離RBAC權限管理系統》
- 《實戰SpringCloud微服務從青銅到王者》
- 《VUE深入淺出系列》
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/103078.html
標籤:Java
上一篇:帶頭節點的單鏈表的一個問題
下一篇:C語言初學者問問題
