GSON:将JSON数据键入Java类,其中类名存储在字符串中

时间:2011-07-11 09:02:10

标签: java json gson

我正在使用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 );

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

1 个答案:

答案 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中提供,那么它就像它获得的一样好。