【问题标题】:Can I instantiate a superclass and have a particular subclass be instantiated based on the parameters supplied我可以实例化一个超类并根据提供的参数实例化一个特定的子类吗
【发布时间】:2011-09-19 11:18:53
【问题描述】:

我正在使用谷歌的 GSON 包http://code.google.com/p/google-gson/

我正在将 JSON 转换为 Java。

我有这段代码用于进行转换。

Gson gson = new Gson();
Type collectionType = new TypeToken<Collection<QueryProperty>>() {}.getType();
Collection<QueryProperty> queryProperties = gson.fromJson(query, collectionType);

我的 QueryProperty 类有这些字段(带有 getter/setter):

int id;
String uri;
String name;
Set<QueryValue> values;
String selected;

QueryValue 类以前有这些字段(带有 getter/setter):

int id;
String uri;
String name;

我现在希望能够拥有不同的types QueryValue。

我想添加一个 NumericQueryValue 类(QueryValue 的子类),这样我就可以传入一组边界来查询数据库。

double lower;
double upper;

并且想要创建一个新的 ResourceQueryValue(QueryValue 的子类),它看起来与以前的 QueryValue 相同:

int id;
String uri;
String name;

无论如何我可以完成这项工作。即有一个通用的 QueryValue 类,但根据 JSON 提供的参数返回正确的子类。

如果我不清楚,请告诉我。

【问题讨论】:

    标签: java javascript json inheritance gson


    【解决方案1】:

    Gson 目前没有简单的多态反序列化机制,除了实现自定义反序列化处理。下一个版本看起来会提供一个内置的解决方案。

    关于此主题的以前的 StackOverflow.com 问题和答案(一些带有示例):

    【讨论】:

    【解决方案2】:

    如果您需要检查值,听起来您想创建一个custom deserializer,或者如果您只需要基于类型创建一个实例,您想创建一个instance creator

    【讨论】:

    • 感谢 Kaj,由于某种原因,我错过了实例创建者的解释。我认为这可能是要走的路。
    • 自定义 InstanceCreator 可能不是采用的路线。 InstanceCreators 用于创建具有默认值的对象——而不是用于自定义反序列化处理。请注意,默认情况下,它们甚至没有对反序列化上下文的引用——因为它们不打算用于替换自定义反序列化器。当您绝对必须使用特定的构造函数时,InstanceCreators 很有用,并且由于某种原因,Gson 使用无参数构造函数是不可接受的(否则它会有效地使用它,即使它不是由编码器或编译器提供的)。跨度>
    猜你喜欢
    • 1970-01-01
    • 2010-12-07
    • 2020-11-21
    • 1970-01-01
    • 2015-06-27
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多