Java 从包装类Gson派生确切的类

Java 从包装类Gson派生确切的类,java,json,parsing,gson,Java,Json,Parsing,Gson,假设我们有以下结构: class BaseClass { ... String typeOfSomeClass; SomeClassBasedOnType someClassBasedOnType; } interface SomeClassBasedOnType { } class SomeClassBasedOnTypeImpl1 implements SomeClassBasedOnType { String str1; } class SomeClass

假设我们有以下结构:

class BaseClass {
    ...
    String typeOfSomeClass;
    SomeClassBasedOnType someClassBasedOnType;
}

interface SomeClassBasedOnType {
}
class SomeClassBasedOnTypeImpl1 implements SomeClassBasedOnType {
    String str1;
}
class SomeClassBasedOnTypeImpl2 implements SomeClassBasedOnType {
    String str2;
}
使用上述结构,我希望使用Gson存储一个JSON。我需要分析的两个可能的JSON是:

{"typeOfSomeClass":"type1", "someClassBasedOnType": {"str1":"someValue"}}

所以我创建了一个GsonBuilder,并用它注册了InstanceCreator。但是,我不知道如何将类型传递给InstanceCreator实现类,因此我可以基于它获得具体的实现。这是我的代码:

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdaptor(SomeClassBasedOnType.class, new SomeClassBasedOnTypeInstanceCreator());
Gson gson = gsonBuilder.create();
BaseClass baseClass = gson.fromJson(strJson, BaseClass.class);
以及我的InstanceCreator实现:

class SomeClassBasedOnTypeInstanceCreator implements InstanceCreator<SomeClassBasedOnType> {
    public SomeClassBasedOnType(Type type) {
       if (the type from BaseClass eq. "type1") {
           return new SomeClassBasedOnTypeImpl1()
       } else {
           return new SomeClassBasedOnTypeImpl2()
       }
    }
}
类SomeClassBasedOnTypeInstanceCreator实现InstanceCreator{
公共SomeClassBasedOnType(类型){
if(来自基类等式“type1”的类型){
返回新的SomeClassBasedOnTypeImpl1()
}否则{
返回新的SomeClassBasedOnTypeImpl2()
}
}
}
唯一的问题是我不知道如何从“基本”JSON获取类型。有什么想法吗


只是为了澄清“base”JSON包含许多键,它们都是相同的,包括键someClassBasedOnType。但是,键someClassBasedOnType可能包含两个不同的JSON对象(具有不同的键),区分这些对象的方法基于名为typeOfSomeClass的“base”JSON中键的值。我想在someClassBasedOnType的InstanceCreator中获取该值,并使用它返回someClassBasedOnType的正确实例。

相关内容:顺便说一句,我已使用自定义反序列化器解决了该问题。然而,应该有更“优雅”的解决方案…“应该有更“优雅”的解决方案”-为什么会有?Gson是为解决一类特殊的问题而构建的,而这不是其中之一。如果需要,使用自定义反序列化程序正是实现此功能的方法。此外,如果您已经解决了问题,您可以解释您所做的工作。
class SomeClassBasedOnTypeInstanceCreator implements InstanceCreator<SomeClassBasedOnType> {
    public SomeClassBasedOnType(Type type) {
       if (the type from BaseClass eq. "type1") {
           return new SomeClassBasedOnTypeImpl1()
       } else {
           return new SomeClassBasedOnTypeImpl2()
       }
    }
}