
Jackson是Spring Boot(SpringBoot)默認的JSON資料處理框架,但是其并不依賴于任何的Spring 庫,有的小伙伴以為Jackson只能在Spring框架內使用,其實不是的,沒有這種限制,它提供了很多的JSON資料處理方法、注解,也包括流式API、樹模型、資料系結,以及復雜資料型別轉換等功能,它雖然簡單易用,但絕對不是小玩具,更多的內容我會寫成一個系列,5-10篇文章,請您繼續關注我,
- 《序列化與反序列化核心用法-JSON框架Jackson精解第1篇》
- 《特殊資料格式處理-JSON框架Jackson精解第2篇》
- 《屬性序列化自定義排序與字母表排序-JSON框架Jackson精解第3篇》
- 《@JacksonInject與@JsonAlias注解-JSON框架Jackson精解第4篇》
- 《@JsonCreator自定義反序列化函式-JSON框架Jackson精解第5篇》
- 《Jaskson精講第6篇-自定義JsonSerialize與Deserialize實作資料型別轉換》
本篇文章是系列文章的第7篇,主要是為大家介紹一下,在Java 類繼承的情況下如何實作父類及子類的JSON序列化與反序列化,
一、繼承關系物件構建
首先構建一個ClsShape類表示形狀,
public class ClsShape {
}
構建一個ClsCircle 類表示圓形,并添加了一系列的lombok注解,Data表示提供get、set、toString、hashCode等方法;EqualsAndHashCode注解在有繼承關系的字類中使用;AllArgsConstructor和NoArgsConstructor分別提供全參和無參構造方法,
@Data
@EqualsAndHashCode(callSuper = true)
@AllArgsConstructor
@NoArgsConstructor
public class ClsCircle extends ClsShape {
Integer radius; //弧度
}
構建一個長方形類ClsRectangle ,成員變數width寬度,height高度,
@Data
@EqualsAndHashCode(callSuper = true)
@AllArgsConstructor
@NoArgsConstructor
public class ClsRectangle extends ClsShape {
private Integer width;
private Integer height;
}
構建一個ClsView類,表示畫面,畫面中有很多的ClsShape形狀,所以用一個List封裝,
@Data
public class ClsView {
private List<ClsShape> shapes;
}
二、序列化與反序列化測驗
基礎的形狀類及畫面類寫完之后,下面的代碼是用來完成:物件到Json字串的序列化程序,和Json字串反序列化為Java物件的程序代碼,
@Test
void testJSON2Object() throws IOException {
ClsRectangle rectangle = new ClsRectangle(7,9); //構建正方形物件
ClsCircle circle = new ClsCircle(8); //構建長方形物件
List<ClsShape> shapes = new ArrayList<>(); //List<多種形狀>
shapes.add(circle);
shapes.add(rectangle);
ClsView view = new ClsView(); //將List放入畫面View
view.setShapes(shapes);
ObjectMapper mapper = new ObjectMapper();
System.out.println("-- 序列化 --");
String jsonStr = mapper.writeValueAsString(view);
System.out.println(jsonStr);
System.out.println("-- 反序列化 --");
ClsView deserializeView = mapper.readValue(jsonStr, ClsView.class);
System.out.println(deserializeView);
}
大家看最終在控制臺的輸出結果如下:序列化的程序是正常的,但是反序列化的時候報錯了,
-- 序列化 --
{"shapes":[{"radius":8},{"width":7,"height":9}]}
-- 反序列化 --
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "radius" (class com.example.demo.javabase.ClsShape), not marked as ignorable (0 known properties: ])
at [Source: (String)"{"shapes":[{"radius":8},{"width":7,"height":9}]}"; line: 1, column: 23] (through reference chain: com.example.demo.javabase.ClsView["shapes"]->java.util.ArrayList[0]->com.example.demo.javabase.ClsShape["radius"])
拋出例外的主要原因是我們用來接收反序列化的結果時,使用的是List<ClsShape>,Java程式并不明確的知道,這個ClsShape形狀是圓形ClsCircle,還是正方形ClsRectangle,所以無法將字串正確的反序列化為java物件,
三、@JsonTypeInfo注解加到父類定義上
為了解決上面的這種繼承關系物件的反序列化出現的問題,jackson為我們提供了JsonTypeInfo注解,把它加在父類定義上面即可,
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
public class ClsShape {
}
在父類定義上面加上@JsonTypeInfo注解之后,序列化與反序列化的輸出結果如下,
-- 序列化 --
{"shapes":[
{"@class":"com.example.demo.javabase.ClsCircle","radius":8},
{"@class":"com.example.demo.javabase.ClsRectangle","width":7,"height":9}
]}
-- 反序列化 --
ClsView(shapes=[ClsCircle(radius=8), ClsRectangle(width=7, height=9)])
值得注意的是在序列化之后的java字串中,每個Json物件都包含了一個新的屬性@class,這也是該物件在繼承關系下能夠反序列化為正確的java物件(@class的值的類物件)的關鍵所在,
四、@JsonTypeInfo注解加到包含父類的成員變數上面
@JsonTypeInfo注解不僅可以加在父類的定義上面,也可以加到包含父類的成員變數上面,序列化和反序列化的結果和第三小節中的內容是一樣的,
@Data
public class ClsView {
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
private List<ClsShape> shapes;
}
歡迎關注我的博客,里面有很多精品合集
- 本文轉載注明出處(必須帶連接,不能只轉文字):字母哥博客,
覺得對您有幫助的話,幫我點贊、分享!您的支持是我不竭的創作動力! ,另外,筆者最近一段時間輸出了如下的精品內容,期待您的關注,
- 《手摸手教你學Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《實戰前后端分離RBAC權限管理系統》
- 《實戰SpringCloud微服務從青銅到王者》
- 《VUE深入淺出系列》
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/135387.html
標籤:Java
