我试图创建JSON到对象映射器。它的主要思想是"user"定义一个字典,其中键是JSON属性,值是object属性名。那么它是如何工作的(到目前为止):
- 从JSON获取值(var jsonValue)
- 从getter (var methodType)获取属性类型
- 创建setter方法并从json中插入值
唯一的问题是我不能动态地将jsonValue转换为对象。我必须检查对象类型是什么(methodType)然后对String, Long, Integer等等进行不同的类型转换。我能动态地转换它吗?
private Cookbook createCookbook(JsonObject jsonCookbook) {
//Cookbook to return
Cookbook cookbook = new Cookbook();
Enumeration<String> e = mappingDictionary.keys();
while (e.hasMoreElements()) {
//get JSON value
String mappingKey = e.nextElement();
JsonElement json = jsonCookbook.get(mappingKey);
String jsonValue = json.getAsString();
//set JSON value to property
String mappingValue = mappingDictionary.get(mappingKey);
//reflection
try {
//get type of the getter
String getMethodName = "get" + mappingValue;
Method getMethod = cookbook.getClass().getMethod(getMethodName, null);
Class<?> methodType = getMethod.getReturnType();
//set methods
String setMethodName = "set" + mappingValue;
Method setMethod = cookbook.getClass().getMethod(setMethodName, methodType);
//set value to property
/* DONT WANT TO DO IT LIKE THIS, THIS IS MY PROBLEM */
if (methodType.equals(String.class))
setMethod.invoke(cookbook, jsonValue);
if (methodType.equals(Long.class))
setMethod.invoke(cookbook, Long.valueOf(jsonValue));
} catch (NoSuchMethodException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IllegalArgumentException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IllegalAccessException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (InvocationTargetException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
return cookbook;
}
您可以在运行时使用反射(如您所使用的)和. newinstance()方法创建未知类型的非原语对象。
你不能用这种方式创建基本类型,例如,如果你看一下标准JDK的序列化实现(objectwwriter的writeObject()),你会看到8个case的切换。