Java GSON未使用通用键/值反序列化正确嵌套的映射

Java GSON未使用通用键/值反序列化正确嵌套的映射,java,json,gson,Java,Json,Gson,我正在使用GSON将JSON字符串反序列化到一个JAVA对象,该对象包含一个具有通用键/值的嵌套映射。 通过调试,我看到GSON将第一个泛型类型转换为正确的对象。但第二个未转换,因此充当字符串 class A { public B<C_Enum> b = new B<C_Enum>(); } class B<T> { private Map<T, T> map = new HashMap<T, T>(); } enum

我正在使用GSON将JSON字符串反序列化到一个JAVA对象,该对象包含一个具有通用键/值的嵌套映射。
通过调试,我看到GSON将第一个泛型类型转换为正确的对象。但第二个未转换,因此充当字符串

class A {
    public B<C_Enum> b = new B<C_Enum>();
}
class B<T> {
    private Map<T, T> map = new HashMap<T, T>();
}
enum C_Enum {
    VAL1, VAL2;
}
main() {
    String json = "{\"b\": {\"map\": {\"NOT_VALID\": \"NOT_VALID\"}}}";
    GsonBuilder builder = new GsonBuilder();
    Gson customDeserializer = builder.create();
    A a = customDeserializer.fromJson(json, A.class);
}
A类{
公共B=新B();
}
B类{
私有映射映射=新的HashMap();
}
枚举C_枚举{
VAL1,VAL2;
}
main(){
字符串json=“{\'b\':{\'map\':{\'NOT\'u VALID\':\'NOT\'u VALID\'}}”;
GsonBuilder=新的GsonBuilder();
Gson customDeserializer=builder.create();
A=customDeserializer.fromJson(json,A.class);
}
在本例中,映射用空键填充,因为NOT_VALID不是有效的C_枚举值,映射的值用NOT_VALID填充。

注意:我的实际代码有点不同,但问题是相同的

有趣。如果注册零序列化程序类型适配器工厂,其
create
方法将仅为以下语句,
System.out.println(typeToken);返回null
,您会看到Gson没有足够的运行时类型信息:
java.util.Map
其中
T
是一个类型参数,而不是实际类型,因此Gson将其反序列化为字符串,而不是枚举。我不确定是否可以在内置反射类型适配器工厂中传播类型信息,但您是否可以不使用类型参数?嗯。。首先,正确的方法是把它打印出来。第二,我注意到我的真实代码与我粘贴的代码有点不同,所以经过一些检查后,我发现删除类型和使用其他内容是相当困难的。我不是说“删除类型”,因此我不是说“不使用类型参数”。抱歉,但我仍然不理解其中的区别。无论如何,我做了一个变通方法,添加了一个适配器工厂来存储类a的类型,然后对于类B,使用该类型来创建正确的适配器。这是可能的,因为类A也被参数化为与B相同的类型(而不是像我之前所展示的那样)```TypeTokenClassAtype//取自类别A类型classAGenericType=((ParameterizedType)ClassAtType.getType()).getActualTypeArguments()[0];类型classBGenericTypeParam=TypeToken.getParameterized(B.class,classAGenericType).getType();TypeToken classBGenericTypeParamToken=TypeToken.get(classBGenericTypeParam);TypeAdapter defaultAdapter=(TypeAdapter)gson.getDelegateAdapter(这个,classBGenericTypeParamToken)```