С примером кода в исходном вопросе 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.