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灯, 水草

请输入看板名称,例如:WOW站内搜寻

TOP