我的 json 包含:
{"timeZone": "America/Los_Angeles"}
在许多其他键中,我想将其反序列化为java.util.TimeZone
。 TimeZone
只是我想用这个 json 实例化的类中的一个字段。
问题是 TimeZone
是一个抽象类,应该用以下方式实例化:
public static synchronized TimeZone getTimeZone(String ID) {
return getTimeZone(ID, true);
它使用具体类ZoneInfo
来实例化。然而,反序列化器默认调用 TimeZone 的构造函数。所以我得到了:
java.lang.RuntimeException: Failed to invoke public java.util.TimeZone() with no args
我想知道如何配置 Gson 从上面的 json 实例化一个 TimeZone
?
最佳答案
您需要创建类似 Gson TypeAdapter
的东西,并将其注册到您的 Gson
实例中。
我不确定这如何/是否适用于您的特定数据格式,但这是我在自己的项目中使用的一个示例:
public class TimeZoneAdapter extends TypeAdapter<TimeZone> {
@Override
public void write(JsonWriter out, TimeZone value) throws IOException {
out.value(value.getID());
}
@Override
public TimeZone read(JsonReader in) throws IOException {
return TimeZone.getTimeZone(in.nextString());
}
}
然后,您可以在构建 Gson
实例时注册它,如下所示:
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(TimeZone.class, new TimeZoneAdapter());
Gson gson = builder.create();
希望这有帮助!
关于java - Gson : Deserialize Json into Abstract Class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38730274/