java 板


LINE

因為抓到的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
1F:→ LaPass:f.getGenericType(); 找到判斷泛型的方法了,用這個 11/08 02:22
2F:→ LaPass:基礎型別還在找.... 11/08 02:28
3F:→ LaPass:找到了,是 Boolean.TYPE 11/08 02:40
4F:推 PsMonkey:我看了頭三行就 end 來推文了,你為什麼不用 gson? 11/08 03:22
5F:→ LaPass:因為沒GOOGLE到那個東西... = = 11/08 03:27
6F:→ LaPass:明天再來試試看.... 希望鑲套、Date、Byte之類的東西也能轉 11/08 03:33
7F:推 qrtt1: 我看了頭三行就 end 來推文了,你為什麼不用 gson? 11/08 09:40
8F:→ LaPass:試了一下,gson沒辦法自己去識別JSON是哪種物件耶 QAQ 11/08 11:17
9F:→ 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)
10F:→ LaPass:總之先來看看GSON的code 11/08 13:05
※ 編輯: LaPass 來自: 111.252.127.215 (11/08 13:06)
11F:→ jcfrank:如果多定一個field去紀錄自己的class full name, 11/09 14:57
12F:→ jcfrank:就可以讓gson結果紀錄它. 這種方式呢? 11/09 15:01
13F:→ LaPass:看起來市自訂一個 TypeAdapterFactory 就可以了,甚至不用 11/09 17:01
14F:→ LaPass:去動到GSON的程式碼 11/09 17:03
15F:→ LaPass:完成 XD 11/10 14:23







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Soft_Job站內搜尋

TOP