作者LaPass (LaPass)
看板java
標題[問題] 如何取得 基礎型別的 class ?
時間Fri Nov 8 02:13:08 2013
因為抓到的JSON libary對於JSON轉換成物件的能力蠻糟糕的
https://github.com/douglascrockford/JSON-java
打算用reflect自己寫個把JSON轉換成物件的小程式
目前正在找判斷欄位型的辦法
總而言之,先看下面的例子
public class Point implements IData
{
public int x;
public int y;
public String[] s;
public int[] ia;
public byte[] b;
public double[] da;
public String st;
public Byte[] ba;
public List<String> ls;
}
然後程式:
Class pc= Point.class;
Field[] fs= pc.getFields();
for(Field f :fs){
System.out.println(f.getName()+":"+f.getType().getName());
}
印出:
x :int
y :int
s :[Ljava.lang.String;
ia:[I
b :[B
da:[D
st:java.lang.String
ba:[Ljava.lang.Byte;
ls:java.util.List
判斷物件的型別很簡單
用 field.getType() == MyObj.class 去判斷就可以了
甚至可以這樣
Map<Class,Convert> m=new HashMap<>();
//取得該型別的轉換器
Convert c = m.get(field.getType());
但很明顯,基礎型別沒辦法像物件一樣,取得所屬的Class
Class c= String.class; <= OK
Class c= int.class <= 不行
總而言之,我一定要去判斷那個欄位的型別
甚至判斷他是哪一種陣列,以及做轉換,請問我該怎麼辦呢?
(例如: JSON中沒分 float 跟 double,但是JAVA有,直接設定下去會這樣)
java.lang.IllegalArgumentException:
Can not set float field com.data.TestItem.f to java.lang.Double
以及
在執行階段我需要判斷泛型中的型別
public List<
String> ls;
但是叫了getType之後出現的是這個.....
ls:java.util.List
我知道JAVA中的泛型是語法糖之類的東西,底層都還是Object在跑
但是如果不判斷這個的話....
會蠻不妙的
好像很容易會因為型別問題出錯
例如會把 Double 加到 List<Float> 當中....
請問有辦法解決嗎?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.38.78.140
→ LaPass:f.getGenericType(); 找到判斷泛型的方法了,用這個 11/08 02:22
→ LaPass:基礎型別還在找.... 11/08 02:28
→ LaPass:找到了,是 Boolean.TYPE 11/08 02:40
推 PsMonkey:我看了頭三行就 end 來推文了,你為什麼不用 gson? 11/08 03:22
→ LaPass:因為沒GOOGLE到那個東西... = = 11/08 03:27
→ LaPass:明天再來試試看.... 希望鑲套、Date、Byte之類的東西也能轉 11/08 03:33
推 qrtt1: 我看了頭三行就 end 來推文了,你為什麼不用 gson? 11/08 09:40
→ LaPass:試了一下,gson沒辦法自己去識別JSON是哪種物件耶 QAQ 11/08 11:17
→ LaPass:我想到怎麼改了,總而言之gson比我當初找的那個好多了 感謝 11/08 11:40
還是有點不滿意....
因為像這種物件:
class Point
{
int x,y;
}
class Test2
{
Object obj=new Point(10,11);
}
序列化之後會變成
{"obj":{"x":10,"y":11}}
這樣OK
但是反序列化之後,會變成
class Test2
{
Object obj=new com.google.gson.internal.LinkedTreeMap();
}
主要還是因為型別被抹掉的關係
其他像是父類別、子類別也有這樣的狀況
我那時候是想在JSON裡面插入一個欄位紀錄物件類別,像這樣
{"objKey":"Test2","obj":{"objKey":"Point","x":10,"y":11}}
這樣就可以確保 JAVA物件跟JSON之間的轉換 能正確的把型別轉換正確
※ 編輯: LaPass 來自: 111.252.127.215 (11/08 13:05)
→ LaPass:總之先來看看GSON的code 11/08 13:05
※ 編輯: LaPass 來自: 111.252.127.215 (11/08 13:06)
→ jcfrank:如果多定一個field去紀錄自己的class full name, 11/09 14:57
→ jcfrank:就可以讓gson結果紀錄它. 這種方式呢? 11/09 15:01
→ LaPass:看起來市自訂一個 TypeAdapterFactory 就可以了,甚至不用 11/09 17:01
→ LaPass:去動到GSON的程式碼 11/09 17:03
→ LaPass:完成 XD 11/10 14:23