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

Comments are closed.

Welcome , today is 星期二, 2017/09/26