使用Gson的泛型类型

ahs*_*ele 26 java generics json gson

我正在尝试创建一个用于Google Gson的通用类.我创造了这门课GsonJsonConverterImplementation<T>.该类具有以下方法:

public T deserialize(String jsonString) {
    GsonBuilder builder = new GsonBuilder();
    builder.setDateFormat("MM/dd/yy HH:mm:ss");

    Gson gson = builder.create();
    return gson.fromJson(jsonString, T); // T.class etc. what goes here
}
Run Code Online (Sandbox Code Playgroud)

目标是这个方法应该能够使用我设置的GsonJsonConverterImplementation所使用的任何类型.不幸的是,gson.fromJson(jsonString, T)它不起作用,也没有用来T.class代替T.我确信这个问题源于我对Java泛型类型缺乏了解.在Gson中使用泛型的正确方法是什么?

编辑
使用Kris的答案我会认为这应该有效.不幸的是,clazz不能以这种方式使用并导致编译器错误.使用Gson的集合和泛型类型有哪些选择?

public List<T> deserializeList(String jsonString, Class<T> clazz) {
    GsonBuilder builder = new GsonBuilder();
    builder.setDateFormat("MM/dd/yy HH:mm:ss");
    Gson gson = builder.create();

    Type listType = new TypeToken<clazz>(){}.getType(); // compiler error

    return gson.fromJson(jsonString, listType);
}
Run Code Online (Sandbox Code Playgroud)

Kri*_*bic 36

您尝试的最简单的方法是定义要在方法签名本身中返回的类的类型.您可以通过将'T'实例传递给方法或将要返回的值的Class传递给它.第二种方法是在您希望生成返回值的情况下更典型.以下是使用Gson的这种方法的示例:

public <T> T deserialize(String jsonString, Class<T> clazz) {
    GsonBuilder builder = new GsonBuilder();
    builder.setDateFormat("MM/dd/yy HH:mm:ss");

    Gson gson = builder.create();
    return gson.fromJson(jsonString, clazz);
}
Run Code Online (Sandbox Code Playgroud)

用法:

MyClass mc = deserialize(jsonString, MyClass.class);
Run Code Online (Sandbox Code Playgroud)


irr*_*ble 5

要获得运行时类型List<T>,给定类T,它会很糟糕,因为JDK认为我们不需要它,所以没有支持.你可以继承ParameterizedType,但它真的很糟糕.

    Type typeListT = new ParameterizedType()
    {
        public Type[] getActualTypeArguments()
        {
            return new Type[]{clazz};
        }
        public Type getRawType()
        {
            return List.class;
        }
        public Type getOwnerType()
        {
            return null;
        }
        public boolean equals(Object obj)
        {
            // must implement equals per spec. this sucks
        }
        public int hashCode()
        {
            // this blows! Java forgot to specific it!
            // since we override equals, we should override hashCode
            // we have no idea what value should be returned here!
            // note we are co-existing with other ParameterizedType impls
        }
    };
Run Code Online (Sandbox Code Playgroud)

  • 这可能是一个糟糕的答案,也许不是咆哮API的缺点,你可以专注于技术细节.目前我甚至没有看到你发布的如何使用该技术. (3认同)