【发布时间】:2016-08-27 00:11:15
【问题描述】:
我有一个带有嵌套子类的类
public class OuterClass {
class GenericClassHolder<R> {
@SerializedName("results")
List<R> results;
public GenericClassHolder() {}
public List<R> getResults() {
return results;
}
}
class ExampleClassA {
@SerializedName("A")
int a;
public ExampleClassA() {}
public int getA() {return a;}
}
class ExampleClassB {
@SerializedName("B")
String b;
public ExampleClassA() {}
public String getB() {return b;}
}
}
目前我希望能够拥有一个函数,该函数将持有的类作为参数,并返回一个适当的 GenericClassHolder 实例,即类似于我当前的代码:
GenericClassHolder<ExampleClassA> genericA = parseJson(jsonString, ExampleClassA.class);
与
<T> GenericClassHolder<T> parseJson(final String jsonString, Class<T> variableClass) throws JsonSyntaxException {
return GSON.fromJson(jsonString, new TypeToken<GenericClassHolder<T>>(){}.getType());
}
但这在我当前的实现中不起作用,出现错误
无法为
GenericClassHolder<T>调用无参数构造函数。使用 Gson 为该类型注册一个 InstanceCreator 可能会解决此问题。
我如何简洁地实现我前面提到的目标,即拥有一个函数,该函数将可能更改的类的规范作为输入并相应地解析为该对象?如果不能通过一个函数来实现优雅的解决方案,那么没有一个函数我怎么能实现这个目标呢?
【问题讨论】:
-
这个
new TypeToken<GenericClassHolder<T>>(){}.getType()不符合您的预期。但是,您向我们展示的错误与您发布的代码无关,afaik。请发帖minimal reproducible example。 -
我收到的错误的堆栈跟踪链接回与我发布的内容相对应的行。你能解释为什么这个错误与我的代码无关吗?我不是说不清楚
-
我无法复制它。我用一些相应的 JSON 调用您的
parseJson,它不会因您建议的异常而失败。 -
你是对的。我希望我可以粘贴导致此错误的原始代码,但我不能,因为它是私有的工作。而且我也试图尽可能具体地复制与我的情况相关的所有内容,但在重现错误时没有这样的运气。这只会让我更加困惑......如果我能够获得它,我将尝试用更多信息更新问题。我很抱歉。
-
@SotiriosDelimanolis 经过一番挖掘,我找到了局部错误的根源。我将此代码部署在 Google Appengine 实例中,由于某些安全原因,我无法反序列化我的反序列化方式并在本地计算机上复制相同的方式。解决方案是使反序列化的类成为静态的;它们也嵌套在外部封装类中。但是,现在我遇到了一个不同的错误,我将在一个单独的问题中解决
标签: java templates serialization gson