在Gson中使用泛型类型

zysjyyx4  于 2022-12-23  发布在  其他
关注(0)|答案(4)|浏览(202)

我正在尝试创建一个泛型类来使用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
}

目标是这个方法应该能够与我设置的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);
}
mpbci0fu

mpbci0fu1#

最简单的方法是定义类的类型,它将在方法签名中返回。你可以通过传递一个'T'的示例给方法或者传递一个要返回的值的类来实现。第二种方法在你希望生成一个返回值的情况下更为典型。下面是一个使用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);
}

用法:

MyClass mc = deserialize(jsonString, MyClass.class);
tf7tbtn2

tf7tbtn22#

要获得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
        }
    };
92dk7w1h

92dk7w1h3#

我正在使用这些方法来读取和写入对象使用GSON。

public static <T> void saveAnyTypeOfObject(String key, T value){
        Gson gson = new Gson();
        String json = gson.toJson(value);
        SharedPref.save(key, json);
    }
    //Type listType = new TypeToken<YourClass>(){}.getType();
    public static <T> T readAnyTypeOfObject(String key, Type tt) {
        Gson gson = new Gson();
        String json = SharedPref.read(key, "{}");
        T obj = gson.fromJson(json, tt);
        return obj;
    }

"读起来就像"

TypeToken<YourClassName> typeToken= new TypeToken<YourClassName>() {};
  YourClassName yourClassName = ListSharedPref.readAnyTypeOfObject("keyForSavingClass", typeToken.getType());

保存

YourClassName yourClassName = gson.fromJson(objJsonObject.toString(),YourClassName.class);               
ListSharedPref.saveAnyTypeOfObject("keyForSavingClass",yourClassName);
pobjuy32

pobjuy324#

如果您序列化了GenericClass<T>这样的泛型对象,则在反序列化时,应提供具有确切类型的 Package 器类,例如:

public class WrapperClass extends GenericClass<Integer>{
// body is not required
}

您可以拨打:

GsonInstance.fromJson(string, WrapperClass.class);

相关问题