[問題] 如何取得 基礎型別的 class ?

看板java作者 (LaPass)時間11年前 (2013/11/08 02:13), 編輯推噓2(2013)
留言15則, 4人參與, 最新討論串1/2 (看更多)
因為抓到的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
f.getGenericType(); 找到判斷泛型的方法了,用這個
11/08 02:22, 1F

11/08 02:28, , 2F
基礎型別還在找....
11/08 02:28, 2F

11/08 02:40, , 3F
找到了,是 Boolean.TYPE
11/08 02:40, 3F

11/08 03:22, , 4F
我看了頭三行就 end 來推文了,你為什麼不用 gson?
11/08 03:22, 4F

11/08 03:27, , 5F
因為沒GOOGLE到那個東西... = =
11/08 03:27, 5F

11/08 03:33, , 6F
明天再來試試看.... 希望鑲套、Date、Byte之類的東西也能轉
11/08 03:33, 6F

11/08 09:40, , 7F
我看了頭三行就 end 來推文了,你為什麼不用 gson?
11/08 09:40, 7F

11/08 11:17, , 8F
試了一下,gson沒辦法自己去識別JSON是哪種物件耶 QAQ
11/08 11:17, 8F

11/08 11:40, , 9F
我想到怎麼改了,總而言之gson比我當初找的那個好多了 感謝
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
總之先來看看GSON的code
11/08 13:05, 10F
※ 編輯: LaPass 來自: 111.252.127.215 (11/08 13:06)

11/09 14:57, , 11F
如果多定一個field去紀錄自己的class full name,
11/09 14:57, 11F

11/09 15:01, , 12F
就可以讓gson結果紀錄它. 這種方式呢?
11/09 15:01, 12F

11/09 17:01, , 13F
看起來市自訂一個 TypeAdapterFactory 就可以了,甚至不用
11/09 17:01, 13F

11/09 17:03, , 14F
去動到GSON的程式碼
11/09 17:03, 14F

11/10 14:23, , 15F
完成 XD
11/10 14:23, 15F
文章代碼(AID): #1IUzWu1w (java)
文章代碼(AID): #1IUzWu1w (java)