我正在使用Google的GSON库将JSON数据转换为Java对象。问题是Java objet的类名也在JSON数据中传递,因此它只能作为字符串使用。我不太熟悉Java,所以当类名存储为字符串时,我不明白如何声明对象。
此外,在初始化数据后我将调用的方法也是如此。
到目前为止,这是相关的代码:
request = gson.fromJson( rawData.toString(), JSONRequest.class );
String method = request.getMethod();
String data = request.getData();
String dataClass = request.getDataClass();
// convert data into an object of dataClass and execute method by passing dataObject
dataClass dataObject = gson.fromJson( data, dataClass.class );
result = method( dataObject );
这似乎是完成数据到对象转换的一种非常粗糙的方式。有没有更好的办法?如果没有,我该如何修复代码?
答案 0 :(得分:1)
使用原始问题中的示例代码,dataClass.class将始终为String.class,我怀疑它是反序列化的正确目标类型。
我认为以下是有意展示的内容。 (我不确定在原始问题中使用了什么JSONRequest实现。我只会做一个。)
如果目标类型确实未知,并且它不是某种已知父类型的子类型,则需要反射来调用该方法。 (这假设目标方法不需要任何参数。)
import java.io.FileReader;
import java.lang.reflect.Method;
import com.google.gson.Gson;
public class Foo
{
public static void main(String[] args) throws Exception
{
Gson gson = new Gson();
// input JSON:
// {
// "dataClass":"com.stackoverflow.q6647866.MyObject",
// "method":"myMethod",
// "data":"{\"name\":\"fubar\"}"
// }
JSONRequest request = gson.fromJson(new FileReader("input.json"), JSONRequest.class);
Class targetClass = Class.forName(request.dataClass);
System.out.println("targetClass: " + targetClass);
Object dataObject = gson.fromJson(request.data, targetClass);
Method method = targetClass.getMethod(request.method);
method.invoke(dataObject);
}
}
class JSONRequest
{
String method;
String data;
String dataClass;
}
class MyObject
{
String name;
public void myMethod()
{
System.out.println("running my method...");
}
}
这似乎是完成数据到对象转换的一种非常粗糙的方式。还有更好的方法吗?
如果要调用的目标数据类型和方法都是完全未知的,并且仅在传入的JSON中提供,那么它就像它获得的一样好。