1. 程式人生 > >FastJson對複雜的泛型物件的解析問題

FastJson對複雜的泛型物件的解析問題

首先要說的是FastJson提供了一個用於處理泛型反序列化的類TypeReference,在知道具體泛型型別的情況下可以實現反序列化,這裡由於應用場景不適用不對其進行討論。

如下場景:

public class PieChartVO<T extends BaseDebtVO> implements Serializable {

	private static final long serialVersionUID = -6422895776727574355L;

	private BigDecimal avgYearRate;
	
	private ArrayList<T>
transVOs; public BigDecimal getAvgYearRate() { return avgYearRate; } public void setAvgYearRate(BigDecimal avgYearRate) { this.avgYearRate = avgYearRate; } public ArrayList<T> getTransVOs() { return transVOs; } public void setTransVOs(ArrayList<T> transVOs) { this.transVOs
= transVOs; } }
public class CreditorDebtVO extends BaseDebtVO {

	private static final long serialVersionUID = -254172337494852158L;

	private BigDecimal totalEarning;

	public BigDecimal getTotalEarning() {
		return totalEarning;
	}

	public void setTotalEarning(BigDecimal totalEarning) {
		this.
totalEarning = totalEarning; } }
public class ObligorDebtVO extends BaseDebtVO {

    private static final long serialVersionUID = 3314361571700869005L;

    private Integer overdueCount;

    private BigDecimal overdueOtherFee;

    public Integer getOverdueCount() {
        return overdueCount;
    }

    public void setOverdueCount(Integer overdueCount) {
        this.overdueCount = overdueCount;
    }

    public BigDecimal getOverdueOtherFee() {
        return overdueOtherFee;
    }

    public void setOverdueOtherFee(BigDecimal overdueOtherFee) {
        this.overdueOtherFee = overdueOtherFee;
    }
}
{
    "body": {
        "avgYearRate": 14.8, 
        "transVOs": [
            {
                "avgRate": 19.2, 
                "cleanCount": 8, 
                "id": 15, 
                "subTitle": "aaa", 
                "title": "bbb", 
                "totalEarning": 20.75, 
                "totalPrincipal": 17000, 
                "transCount": 3, 
                "transMoney": 4698.93, 
                "transOverdueMoney": 0
            }
        ]
    }, 
    "result": 1
}

對於獲取到的json資料並不知道具體的泛型型別,也就沒法指定的情況下,解決方案是對反序列化進行自定義定製,fastJson自身對基礎的field內建了許多反序列化器,當對json反序列化時,會根據filed的class找到相應的反序列化器來執行反序列化。

public class ParserConfig {

    private final IdentityHashMap<Type, ObjectDeserializer> deserializers = new IdentityHashMap<Type, ObjectDeserializer>();

    /**省略了其他程式碼*/
    private void initDeserializers() {
        deserializers.put(SimpleDateFormat.class, MiscCodec.instance);
        deserializers.put(java.sql.Timestamp.class, SqlDateDeserializer.instance_timestamp);
        deserializers.put(java.sql.Date.class, SqlDateDeserializer.instance);
        deserializers.put(java.sql.Time.class, TimeDeserializer.instance);
        deserializers.put(java.util.Date.class, DateCodec.instance);
        deserializers.put(Calendar.class, CalendarCodec.instance);
        deserializers.put(XMLGregorianCalendar.class, CalendarCodec.instance);

        deserializers.put(JSONObject.class, MapDeserializer.instance);
        deserializers.put(JSONArray.class, CollectionCodec.instance);

        deserializers.put(Map.class, MapDeserializer.instance);
        deserializers.put(HashMap.class, MapDeserializer.instance);
        deserializers.put(LinkedHashMap.class, MapDeserializer.instance);
        deserializers.put(TreeMap.class, MapDeserializer.instance);
        deserializers.put(ConcurrentMap.class, MapDeserializer.instance);
        deserializers.put(ConcurrentHashMap.class, MapDeserializer.instance);

        deserializers.put(Collection.class, CollectionCodec.instance);
        deserializers.put(List.class, CollectionCodec.instance);
        deserializers.put(ArrayList.class, CollectionCodec.instance);

        deserializers.put(Object.class, JavaObjectDeserializer.instance);
        deserializers.put(String.class, StringCodec.instance);
        deserializers.put(StringBuffer.class, StringCodec.instance);
        deserializers.put(StringBuilder.class, StringCodec.instance);
        deserializers.put(char.class, CharacterCodec.instance);
        deserializers.put(Character.class, CharacterCodec.instance);
        deserializers.put(byte.class, NumberDeserializer.instance);
        deserializers.put(Byte.class, NumberDeserializer.instance);
        deserializers.put(short.class, NumberDeserializer.instance);
        deserializers.put(Short.class, NumberDeserializer.instance);
        deserializers.put(int.class, IntegerCodec.instance);
        deserializers.put(Integer.class, IntegerCodec.instance);
        deserializers.put(long.class, LongCodec.instance);
        deserializers.put(Long.class, LongCodec.instance);
        deserializers.put(BigInteger.class, BigIntegerCodec.instance);
        deserializers.put(BigDecimal.class, BigDecimalCodec.instance);
        deserializers.put(float.class, FloatCodec.instance);
        deserializers.put(Float.class, FloatCodec.instance);
        deserializers.put(double.class, NumberDeserializer.instance);
        deserializers.put(Double.class, NumberDeserializer.instance);
        deserializers.put(boolean.class, BooleanCodec.instance);
        deserializers.put(Boolean.class, BooleanCodec.instance);
        deserializers.put(Class.class, MiscCodec.instance);
        deserializers.put(char[].class, new CharArrayCodec());

        deserializers.put(AtomicBoolean.class, BooleanCodec.instance);
        deserializers.put(AtomicInteger.class, IntegerCodec.instance);
        deserializers.put(AtomicLong.class, LongCodec.instance);
        deserializers.put(AtomicReference.class, ReferenceCodec.instance);

        deserializers.put(WeakReference.class, ReferenceCodec.instance);
        deserializers.put(SoftReference.class, ReferenceCodec.instance);

        deserializers.put(UUID.class, MiscCodec.instance);
        deserializers.put(TimeZone.class, MiscCodec.instance);
        deserializers.put(Locale.class, MiscCodec.instance);
        deserializers.put(Currency.class, MiscCodec.instance);
        deserializers.put(InetAddress.class, MiscCodec.instance);
        deserializers.put(Inet4Address.class, MiscCodec.instance);
        deserializers.put(Inet6Address.class, MiscCodec.instance);
        deserializers.put(InetSocketAddress.class, MiscCodec.instance);
        deserializers.put(File.class, MiscCodec.instance);
        deserializers.put(URI.class, MiscCodec.instance);
        deserializers.put(URL.class, MiscCodec.instance);
        deserializers.put(Pattern.class, MiscCodec.instance);
        deserializers.put(Charset.class, MiscCodec.instance);
        deserializers.put(JSONPath.class, MiscCodec.instance);
        deserializers.put(Number.class, NumberDeserializer.instance);
        deserializers.put(AtomicIntegerArray.class, AtomicCodec.instance);
        deserializers.put(AtomicLongArray.class, AtomicCodec.instance);
        deserializers.put(StackTraceElement.class, StackTraceElementDeserializer.instance);

        deserializers.put(Serializable.class, JavaObjectDeserializer.instance);
        deserializers.put(Cloneable.class, JavaObjectDeserializer.instance);
        deserializers.put(Comparable.class, JavaObjectDeserializer.instance);
        deserializers.put(Closeable.class, JavaObjectDeserializer.instance);

        deserializers.put(JSONPObject.class, new JSONPDeserializer());
    }

    public ObjectDeserializer getDeserializer(Class<?> clazz, Type type) {
        /** 首先從內部已經註冊查詢特定type的反序列化例項 */
        ObjectDeserializer derializer = deserializers
            
           

相關推薦

jackson 反序列化複雜物件

最近在使用Redis 快取資料的時候使用的spring 的aop自動從快取中去區json資料。發現方法的返回值帶有泛型時,直接簡單的呼叫使用下面的方法無法拿到正確的結果。 Method method = ((MethodSignature) pjp.getSignature(

FastJson複雜物件解析問題

首先要說的是FastJson提供了一個用於處理泛型反序列化的類TypeReference,在知道具體泛型型別的情況下可以實現反序列化,這裡由於應用場景不適用不對其進行討論。如下場景:public class PieChartVO<T extends BaseDebtVO

FastJson解析String為物件

test package com.dl.utils; import java.util.Date; import com.alibaba.fastjson.JSON; import sds.db.dao.User; public class Test { public st

Mooc軟件工程-02面向

組成 ima 固然是 name 成員 專註 對象 指示 類的繼承 1 內聚   模塊     語義上連續的一系列語句, 由邊界符界定, 並且有一個聚集標識符   常見的模塊     在面向對象中的 類, 方法     在面向過程的 函數   模塊功能單一, 內部

json-gson 解析解析null

swa [] pty flow implement blog 列表 parameter 但是 參考://public static class paraJson {public class paraJson{ static Gson gson = new Gso

fastJson轉換為類(List<T>)

在處理json資料時,會遇到將json串轉成javaBean的情況,這時候用fastJson的JSONObject.parseObject(text, clazz)方法很好用,不過轉換為類似List<T> 、Map<Obj,Obj>、PageInfo<T>這類

獲取通過反射獲取物件

public static <T> T injectT(Object object, int position) { try { return ((Class<T>) ((ParameterizedType) (obje

Mapreduce學習:mapper類中的4個引數解析

先看程式碼 public class FlowCountMapper extends Mapper<LongWritable, Text, Text, FlowBean>{ } 1、LongWritable:表示worder傳入KEY的資料型別,預

ArrayList利用物件操作

ArrayList用法:   ArrayList是介面List的實現類,所以推薦以List介面來使用。   1、建立ArrayList的List介面   例:   List books = new ArrayList();   Java支援泛形後,建立的同時可以

fastJson轉換為類(List)

在處理json資料時,會遇到將json串轉成javaBean的情況,這時候用fastJson的JSONObject.parseObject(text, clazz)方法很好用,不過轉換為類似List<T> 、Map<Obj,Obj>、PageInfo&

java物件初始化--java物件能例項化嗎T t=new T()

java中沒法得到泛型引數化型別,因為在編譯期沒法確定泛型引數化型別,也就找不到對應的類位元組碼檔案,自然就不行了  泛型反射的關鍵是獲取ParameterizedType,再呼叫它的getAct

Unity之物件池(單例物件池和物件池)

眾所周知,遊戲開發中記憶體和效能一直是影響使用者遊戲體驗的至關重要的兩個因素,這次說一說物件池的概念。 物件池意義是將遊戲中反覆建立銷燬的物件進行多次利用,從而避免大量物件的銷燬與建立而造成CPU的負

在base類中獲取的型別和物件

class A<T,S> {     //獲取S的class public Class<T> poClass = (Class<T>) (((ParameterizedType) this.getClass().getGeneric

關於 java 中T extendscompareable

public class Student implements Comparable<Student>{ private int id; public Student(int id) { this.id = id; } @Override p

List vs Array:誰適合做java中物件的容器?

在java中,我們知道有兩大類線性的資料結構是陣列(Array)和連結串列(主要是ArrayList和LinkedList)。對於一般的物件來說,我們可以選擇這兩類資料結構中的任何一種資料結構來儲存我們的物件。但是對於泛型物件,我們應該選擇哪種資料結構來儲存他們呢?答案是:

Java的理解夠深入嗎?

泛型 泛型提供了一種將集合型別傳達給編譯器的方法,一旦編譯器知道了集合元素的型別,編譯器就可以對其型別進行檢查,做型別約束。 在沒有泛型之前: /** * 迭代 Collection ,注意 Collection 裡面只能是 String 型別 */ public static void forEachS

fastjson解析巢狀

/** * author zoush * CreateTime 2017-06-03 16:01 * 直接上虛擬碼 */ public class Outer<T> {

Gson和fastJson 解析巢狀的json資料

Test /* * { "code": 1, "datas": [{ "address": "深圳",

使用Gson解析複雜巢狀資料結構

一、Gson Gson是由Google自家出來的Json解析庫,使用起來相容性方面當然會有很多優勢,而且解析Json資料也很方便,掌握了Gson的一些基本使用之後就可以使用它解析很多複雜的Json資料了。但當我們要解析一個複雜的資料結構時,比如說List<

Android JSON資料格式的解析,與簡單物件、帶的List和Map的轉換,以及GSON的使用

首先,這裡要先說一下 JSON 的語法。 1、使用 JSON 語法建立物件         如圖,建立 object 時,總是以 “{” 開始,以 “}” 結束,物件的每個屬性和屬性值之間以英文冒號 “:” 隔開,多個屬性定義之間以英 文逗號 “,” 隔開。語法格式如下: