Gson的JSON轉換成JAVA物件時,型別資訊遺失的解決方法
想要把JSON轉換成JAVA物件,或是把JAVA物件轉換成JSON怎麼做呢?
Gson 是個好用的JSON對JAVA的轉換工具,他可以將JSON轉換成JAVA物件,以及把JAVA物件轉換成JSON
例如:
JAVA:
class A
{
String a="NAME";
int id=500;
}
轉成JSON之後,就會變成
JSON:
{"a":"NAME","id":500}
詳細說明可以看Gson的官方網站
Gson的官方網站
但很遺憾的是,Gson有個缺點,那就是….
gson對繼承之類的處理比較糟糕
gson跟我找到其他json工具一樣,都會把物件型別資料給丟掉
所以,在java to json這一段是ok的
但是 json to java這一段就會出問題
Gson是看物件欄位的型別在建立實體
所以像這種狀況,Gson都沒辦法把JSON完整的轉回來
class Test{
A a=new AChile();
}
轉成JSON後,再把JSON轉回物件時,一定會變成
class Test{
A a=new A();
}
總之,Gson讀到物件的一個欄位時
是這樣處理的
A a=new AChild();
1.讀到A
2.呼叫處理A的Adapter去解析a,印出JSON
PS.裡面有大約有二三十個Adapter在處理各種型別基礎型別
然後,如果沒有合適的Adapter,Gson會用反射把所有的欄位都去印出來
那段程式碼在
com.google.gson.internal.bind.ReflectiveTypeAdapterFactor
在把JSON轉成物件時,是這樣處理的
A a=new A();
1.讀到A
2.用反射建立A的實體
JSON “a":{“str":"字串","id":..略..}
3.找A的欄位,然後再去找JSON的同名欄位,把值塞進去
如果A沒有那個欄位,就不管
我是在JSON裡面加個標籤去識別物件類型
寫個 TypeAdapterFactory 就可以解決了
完全不用修改到Gson的Code就能解決了
總而言之,程式碼的範例如下:
使用範例: demo
原始碼: f23-gson-1.2.src
Jar: f23-gson-1.2.jar