Jackson對多態和多子類序列化的處理配置


Jackson

Jackson可以輕松的將Java對象轉換成json對象和xml文檔,同樣也可以將json、xml轉換成Java對象。

多態類型的處理

jackson允許配置多態類型處理,當進行反序列話時,JSON數據匹配的對象可能有多個子類型,為了正確的讀取對象的類型,我們需要添加一些類型信息。可以通過下面幾個注解來實現:
@JsonTypeInfo
作用於類/接口,被用來開啟多態類型處理,對基類/接口和子類/實現類都有效

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,include = JsonTypeInfo.As.PROPERTY,property = "name")  

這個注解有一些屬性,
use:定義使用哪一種類型識別碼,它有下面幾個可選值:
1、JsonTypeInfo.Id.CLASS:使用完全限定類名做識別
2、JsonTypeInfo.Id.MINIMAL_CLASS:若基類和子類在同一包類,使用類名(忽略包名)作為識別碼
3、JsonTypeInfo.Id.NAME:一個合乎邏輯的指定名稱
4、JsonTypeInfo.Id.CUSTOM:自定義識別碼,由@JsonTypeIdResolver對應,稍后解釋
5、JsonTypeInfo.Id.NONE:不使用識別碼
include(可選):指定識別碼是如何被包含進去的,它有下面幾個可選值:
1、JsonTypeInfo.As.PROPERTY:作為數據的兄弟屬性
2、JsonTypeInfo.As.EXISTING_PROPERTY:作為POJO中已經存在的屬性
3、JsonTypeInfo.As.EXTERNAL_PROPERTY:作為擴展屬性
4、JsonTypeInfo.As.WRAPPER_OBJECT:作為一個包裝的對象
5、JsonTypeInfo.As.WRAPPER_ARRAY:作為一個包裝的數組
property(可選):制定識別碼的屬性名稱
此屬性只有當use為JsonTypeInfo.Id.CLASS(若不指定property則默認為@class)、JsonTypeInfo.Id.MINIMAL_CLASS(若不指定property則默認為@c)、JsonTypeInfo.Id.NAME(若不指定property默認為@type),include為JsonTypeInfo.As.PROPERTY、JsonTypeInfo.As.EXISTING_PROPERTY、JsonTypeInfo.As.EXTERNAL_PROPERTY時才有效
defaultImpl(可選):如果類型識別碼不存在或者無效,可以使用該屬性來制定反序列化時使用的默認類型
visible(可選,默認為false):是否可見
屬性定義了類型標識符的值是否會通過JSON流成為反序列化器的一部分,默認為fale,也就是說,jackson會從JSON內容中處理和刪除類型標識符再傳遞給JsonDeserializer。
@JsonSubTypes
作用於類/接口,用來列出給定類的子類,只有當子類類型無法被檢測到時才會使用它
一般是配合@JsonTypeInfo在基類上使用,比如:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,include = JsonTypeInfo.As.PROPERTY,property = "typeName")  
@JsonSubTypes({@JsonSubTypes.Type(value=Sub1.class,name = "sub1"),@JsonSubTypes.Type(value=Sub2.class,name = "sub2")})  

@JsonSubTypes的值是一個@JsonSubTypes.Type[]數組,里面枚舉了多態類型(value對應類)和類型的標識符值(name對應@JsonTypeInfo中的property標識名稱的值,此為可選值,若不制定需由@JsonTypeName在子類上制定)
@JsonTypeName
作用於子類,用來為多態子類指定類型標識符的值
比如:

@JsonTypeName(value = "sub1")  

使用參考
配置參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM