作者LaPass (LaPass)
看板java
标题[问题] 如何取得 基础型别的 class ?
时间Fri Nov 8 02:13:08 2013
因为抓到的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