使用Jackson和Super类型令牌进行Json反序列化
Datatables是一個jquery插件,用于顯示表格信息–它可以增強簡單的表或可以使用基于AJAX的數據并以表格形式顯示信息。
數據表要??求來自服務器的數據遵循特定的JSON格式才能在屏幕上顯示。 考慮要顯示成員實體列表的情況,那么對于成員而言,預期的json結構必須遵循以下幾行:
可以定義一個通用的Java類型, Jackson可以使用它來生成上述類型的json,請考慮以下Java通用類型:
package mvcsample.types; import java.util.List;public class ListWrapper<T> {private List<T> aaData;private int iTotalRecords;private int iTotalDisplayRecords;private Boolean success;public List<T> getAaData() {return aaData;}public void setAaData(List<T> aaData) {this.aaData = aaData;}public int getiTotalRecords() {return iTotalRecords;}public void setiTotalRecords(int iTotalRecords) {this.iTotalRecords = iTotalRecords;}public int getiTotalDisplayRecords() {return iTotalDisplayRecords;}public void setiTotalDisplayRecords(int iTotalDisplayRecords) {this.iTotalDisplayRecords = iTotalDisplayRecords;}public Boolean getSuccess() {return success;}public void setSuccess(Boolean success) {this.success = success;} }因此,使用此泛型類型,要生成成員列表,我將具有如本測試中定義的參數化類型:
List<Member> members = new ArrayList<>(); members.add(new Member('one', 'one')); members.add(new Member('two', 'two')); ListWrapper<Member> membersWrapper = new ListWrapper<>(); membersWrapper.setAaData(members); membersWrapper.setiTotalDisplayRecords(10); membersWrapper.setiTotalRecords(100); ObjectMapper objectMapper = new ObjectMapper();StringWriter w = new StringWriter(); objectMapper.writeValue(w, membersWrapper); String json = w.toString(); System.out.println(json);同樣,可以生成任何其他類型的json。
但是, 相反,生成給定json的Java類型呢?
再一次,考慮將開頭給出的json轉換為ListWrapper <Member>的情況,我可以這樣嘗試反序列化:
ObjectMapper objectMapper = new ObjectMapper(); ListWrapper<Member> membersUpdated = objectMapper.readValue(json, ListWrapper.class);請注意,上面我不能將類類型稱為ListWrapper <Member> .class,而只能將其稱為ListWrapper.class。
但是,這將不起作用,并且結果類型也不會成為Member類的包裝器,因為在運行時Jackson并不知道必須生成ListWrapper <Member>。
解決方法是以某種方式將有關ListWrapper類型的信息傳遞給Jackson,這是Super類型標記所適合的地方。 本文詳細說明了它的工作原理,其實質是,盡管類型擦除確實從參數化實例的類型中刪除了類型信息。泛型類型,但是類型保留在泛型類的子類中。
例如。 考慮以下從ArrayList <String>派生的StringList類,可以發現基類的type參數是String,如下面的測試所示:
import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.ArrayList;public class StringList extends ArrayList<String>{public static void main(String[] args) {StringList list = new StringList();Type superClassType = list.getClass().getGenericSuperclass();ParameterizedType parameterizedType = (ParameterizedType)superClassType;System.out.println(parameterizedType.getActualTypeArguments()[0]);} }這同樣適用于子類也被定義為匿名類的情況:
ArrayList<String> list = new ArrayList<String>(){}; Type superClassType = list.getClass().getGenericSuperclass(); ParameterizedType parameterizedType = (ParameterizedType)superClassType; System.out.println(parameterizedType.getActualTypeArguments()[0]);這是Super Type令牌模式在內部使用的功能,用于查找參數化類型的類型。 Jackson的com.fasterxml.jackson.core.type.TypeReference抽象類實現了此功能,使用此功能,Jackson反序列化將以這種方式工作:
import com.fasterxml.jackson.core.type.TypeReference;.... ListWrapper<Member> membersWrapper = objectMapper.readValue(json, new TypeReference<ListWrapper<Member>>() {});ListWrapper<Address> addressWrapper = objectMapper.readValue(json, new TypeReference<ListWrapper<Address>>() {});這樣,可以在給定通用類型和json表示的情況下反序列化兩個不同的參數化類型。
資源:
- 反映泛型 :http://www.artima.com/weblogs/viewpost.jsp? thread = 208860
- 尼爾·古夫特(Neal Gafter)的超級類型令牌 :http://gafter.blogspot.com/2006/12/super-type-tokens.html
參考: all和雜物博客中的Json用我們的JCG合作伙伴 Biju Kunjummen的Jackson和Super類型令牌進行反序列化 。
翻譯自: https://www.javacodegeeks.com/2013/01/json-deserialization-with-jackson-and-super-type-tokens.html
總結
以上是生活随笔為你收集整理的使用Jackson和Super类型令牌进行Json反序列化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ppt快捷键教程图解(ppt常用快捷键一
- 下一篇: 绝地求生最新画面设置(绝地求生最新游戏画