看板 java 關於我們 聯絡資訊
因為抓到的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