[問題] 如何取得 基礎型別的 class ?
因為抓到的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
→
11/08 02:22, , 1F
11/08 02:22, 1F
→
11/08 02:28, , 2F
11/08 02:28, 2F
→
11/08 02:40, , 3F
11/08 02:40, 3F
推
11/08 03:22, , 4F
11/08 03:22, 4F
→
11/08 03:27, , 5F
11/08 03:27, 5F
→
11/08 03:33, , 6F
11/08 03:33, 6F
推
11/08 09:40, , 7F
11/08 09:40, 7F
→
11/08 11:17, , 8F
11/08 11:17, 8F
→
11/08 11:40, , 9F
11/08 11:40, 9F
還是有點不滿意....
因為像這種物件:
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)
→
11/08 13:05, , 10F
11/08 13:05, 10F
※ 編輯: LaPass 來自: 111.252.127.215 (11/08 13:06)
→
11/09 14:57, , 11F
11/09 14:57, 11F
→
11/09 15:01, , 12F
11/09 15:01, 12F
→
11/09 17:01, , 13F
11/09 17:01, 13F
→
11/09 17:03, , 14F
11/09 17:03, 14F
→
11/10 14:23, , 15F
11/10 14:23, 15F
討論串 (同標題文章)
完整討論串 (本文為第 1 之 2 篇):
java 近期熱門文章
PTT數位生活區 即時熱門文章