寫在以前java
相信你們在項目中很多接觸微服務化,而說到微服務化,就不得不說到restful接口,而說到restful接口,就不得不說其規範格式json字符串,而談到json字符串,就不得不提一下java的序列化與反序列化。沒錯,咱們今天的主題就是JSON字符串的反序列化與序列化,哈哈,不要慌不要躁,慢慢看。程序員
場景需求json
有A、B、C三個API,A調B而且POST請求發送json字符串{"candidate-id":"1234343","overall-score":"85","create-date":"2018-06-01"},B接收該請求要將該字符串反序列化轉爲對象,而後B調C而且發送POST請求(剛纔的對象做爲請求參數的一部分),這個時候須要序列化剛纔的對象,C要求的格式是{"candidateId":"1234343","overallScore":"85","createDate":"2018-06-01"}。總結一下,就是對同一個對象的序列化和反序列化要求key不一樣。restful
初探@JsonProperty微服務
開始只是考慮到反序列化的key對不上,通過一番查詢資料,發現@JsonProperty這個註解,恰好能知足個人需求,將不規則id的json字符串轉化我須要的對象。只要將@JsonProperty(value = "irregular-name")加到類成員頭部就行了,jackson Json反序列化的時候會調用該註解進行key匹配。可是當我對該對象進行序列化的時候發現,並不能知足個人需求,序列化以後的key也變成了我定義的不規則的key。測試
通過一系列的騷操做,我又嘗試了一下@JsonProperty(value = "irregular-name",access = JsonProperty.Access.READ_ONLY),也就是加上access這個屬性,最後發現也不行,查了一下,這個是控制該成員是否容許序列化和是否容許反序列化的。有興趣的小夥伴能夠嘗試一下,作作實例,看看報,喝喝茶,水水羣什麼的,啊,扯遠了,嘻嘻...ui
怎麼辦呢this
很慌啊,我還不信了,我不想新建對象進行從新賦值,內容都是同樣的,感受不爽啊。程序員靠天靠地不如靠本身靠谷歌,沒錯就是它讓我發現了一樣的需求(固然,若是有時間的話,深究一下原理也是很好的,不僅停留在應用上,奮鬥.gif),這裏mark一下jackson json 序列化與反序列化時json中字段名稱問題。該博主的場景恰好和上面描述的場景相反,有興趣的能夠點進去看看,也能夠接着看個人實例,也能夠二者作一下對比。筆者在這裏提煉了一下: 實體bean的get方法對應序列化,而set方法則對應反序列化。也就是jackson在進行序列化的時候調用的是get方法,而反序列化的時候調用的是set方法。spa
個人代碼實例.net
一、建立個人實體bean
1 package com.yrml.singleton.bean; 2 3 import com.fasterxml.jackson.annotation.JsonProperty; 4 5 /** 6 * 個人實體bean 7 * 8 * @author zhaohui.tan 9 */ 10 public class RequestBody { 11 12 private String candidateId; 13 14 private String overallScore; 15 16 private String createDate; 17 18 19 @JsonProperty("candidateId") //序列化的時候要求,規則的名稱 20 public String getCandidateId() { 21 return candidateId; 22 } 23 24 @JsonProperty(value = "candidate-id") //反序列化的時候key名不規則 25 public void setCandidateId(final String candidateId) { 26 this.candidateId = candidateId; 27 } 28 29 @JsonProperty("overallScore") 30 public String getOverallScore() { 31 return overallScore; 32 } 33 34 @JsonProperty(value = "overall-score") 35 public void setOverallScore(final String overallScore) { 36 this.overallScore = overallScore; 37 } 38 39 @JsonProperty("createDate") 40 public String getCreateDate() { 41 return createDate; 42 } 43 44 @JsonProperty("create-date") 45 public void setCreateDate(String createDate) { 46 this.createDate = createDate; 47 } 48 49 }
二、main測試
1 public class MyTest { 2 3 public static void main(String[] args) { 4 5 String json1 = "{\"candidate-id\":\"IA_284573557_usug\", \"overall-score\":\"86\", \"create-date\":\"2018-06-01\"}"; 6 RequestBody msg1 = JsonUtil.fromJson(json1, RequestBody.class); 7 System.out.println("msg:" + msg1); 8 9 String result1 = JsonUtil.toJsonString(msg1); 10 System.out.println("result:" + result1); 11 12 } 13 }
三、測試結果
1 msg:com.yrml.singleton.bean.RequestBody@4df50bcc 2 result:{"candidateId":"IA_284573557_usug","overallScore":"86","createDate":"2018-06-01"}
四、這裏須要注意一點,個人實體bean中get方法的名稱仍是正規的,也就是咱們普通生成getter、setter方法時候的名稱。可是這兒有個問題,經過普通Java類測試的時候是沒有問題的,也就是上面的實例所示。可是,當在HTTP請求的時候,就會報錯。這個時候須要經get方法的名稱該變一下。以下所示:【這個原理倒沒有深究了,有興趣的小夥伴能夠研究一下】
1 @JsonProperty("candidateId") 2 public String getCandidate_Id() { 3 return candidateId; 4 } 5 6 @JsonProperty("overallScore") 7 public String getOverall_Score() { 8 return overallScore; 9 } 10 11 @JsonProperty("createDate") 12 public String getCreate_Date() { 13 return createDate;
寫在最後
書山有路勤爲徑、學海無害苦做舟. <手動Mrak、>