GSON:将JSON数据输入到Java类中,该类的类名存储在字符串中

GSON:将JSON数据输入到Java类中,该类的类名存储在字符串中,java,json,gson,Java,Json,Gson,我正在使用Google的库将JSON数据转换为Java对象。问题是Java对象的类名也在JSON数据中传递,因此它只能作为字符串使用。我对Java不太熟悉,所以我不明白当类名存储为字符串时如何声明对象 同样,我将在数据初始化后调用的方法也是如此 以下是到目前为止的相关代码: request = gson.fromJson( rawData.toString(), JSONRequest.class ); String method = request.getMethod(); String d

我正在使用Google的库将JSON数据转换为Java对象。问题是Java对象的类名也在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 );

这似乎是完成数据到对象转换的一种非常粗糙的方法。有更好的办法吗?如果没有,我如何修复代码?

使用原始问题中的示例代码,dataClass.class将始终是String.class,我怀疑这是要反序列化的正确目标类型

我认为以下是打算演示的内容。(我不确定在最初的问题中使用了什么样的JSONRequest实现。我将补充一个。)

如果目标类型确实是未知的,并且它不是某个已知父类型的子类型,那么调用该方法将需要反射。(这假设目标方法不需要任何参数。)

这似乎是完成数据到对象转换的一种非常粗糙的方法。有更好的办法吗

如果要调用的目标数据类型和方法都是完全未知的,并且只在传入的JSON中提供,那么这就足够了

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...");
  }
}