如何使对象返回泛型

时间:2014-08-18 14:46:23

标签: java json generics

我正在查看谷歌提供的以下Gson库。在我关注的教程中,我找到了以下代码片段;

public class JsonToJava {

    public static void main(String[] args) throws IOException {
        try(Reader reader = new InputStreamReader(JsonToJava.class.getResourceAsStream("/Server1.json"), "UTF-8")){
            Gson gson = new GsonBuilder().create();
            Person p = gson.fromJson(reader, Person.class);
            System.out.println(p);
        }
    }
}

是否可以使这种通用,例如,如果您有以下参数

public Object getObjectFromJSONString(String jsonString, Class classType){

然后我们知道类类型,是否可以返回任何对象类型或者我必须有单独的方法,convertJSONToClassA,convertJSONToClassB,convertJSONToClassC等等?

5 个答案:

答案 0 :(得分:1)

返回classType的泛型类型参数。如果您使用Class<String>调用它,则会返回String等等...

public <T> T getObjectFromJSONString(String jsonString, Class<T> classType) {
    // Your code here
}

这正是Gson#fromJson(String, Class)的实施所做的。

答案 1 :(得分:1)

我认为以下是您想要的

public <T> T getObjectFromJSONString(String jsonString, Class<T> classType) {

该方法仍然执行相同的操作但现在不是总是返回Object的实例,而是返回您将其作为参数传递给它的任何类的实例。

答案 2 :(得分:1)

查看Gson的源文件(https://code.google.com/p/google-gson/source/browse/trunk/gson/src/main/java/com/google/gson/Gson.java) fromJson的方法可以根据需要进行参数化。

public <T> T fromJson(String json, Class<T> classOfT)

答案 3 :(得分:0)

现有方法:

 fromJson(Reader reader, Class classType);

此方法实际上采用您需要的任何对象类型,并将您的json转换为它。

包裹方法:

public <T> T convertJsonToJava(Reader reader, Class<T> clazz ) {

    T javaObject = null; // Declare the intended object to return

    Gson gson = new GsonBuilder().create(); // Create a Gson instance
    javaObject  = gson.fromJson(reader, clazz); // Get your object from Json

    return javaObject ; // Return your object
}

答案 4 :(得分:0)

您不能使用classType参数。

java的泛型机制只能通过参数类型而不是值来解析泛型方法。

可以做什么,假设你的Json对象有一个默认构造函数(大多数都是) 实际实例化一个对象参数,以便它可以用作泛型解析器的提示。像这样:

   Person p = readJson(reader, new Person());
   Car c = readJson(reader, new Car());
   House h = readJson(reader, new ());

其中:

   public <T> T readJson(Reader reader, Object obj) {
        return  gson.fromJson(reader, obj.getClass());
   }