Java Gson:将Json反序列化为抽象类

Java Gson:将Json反序列化为抽象类,java,json,Java,Json,我的json包含: {"timeZone": "America/Los_Angeles"} 在许多其他键中,我想将其反序列化为java.util.TimeZoneTimeZone只是我想用这个json实例化的类中的一个字段 问题在于,TimeZone是一个抽象类,应该用以下内容实例化: public static synchronized TimeZone getTimeZone(String ID) { return getTimeZone(ID, true); 它使用一个

我的json包含:

{"timeZone": "America/Los_Angeles"}
在许多其他键中,我想将其反序列化为
java.util.TimeZone
TimeZone
只是我想用这个json实例化的类中的一个字段

问题在于,
TimeZone
是一个抽象类,应该用以下内容实例化:

public static synchronized TimeZone getTimeZone(String ID) {
        return getTimeZone(ID, true);
它使用一个具体的类
ZoneInfo
来实例化。但是,默认情况下,反序列化程序调用
时区的构造函数。所以我得到:

java.lang.RuntimeException: Failed to invoke public java.util.TimeZone() with no args

我想知道如何配置Gson来从上面的json实例化一个
时区

您需要创建一个类似于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());
  }
}

希望这有帮助

您是否尝试过使用SimpleTimeZone之类的非抽象类?我敢说这是不可能的。序列化程序需要实例化以生成输出值,抽象类无法实例化。@JAVAC来自库类,很遗憾,我无法更改它。@FeType但是
ZoneInfo
扩展了
TimeZone
,我只想在
TimeZone
中调用正确的方法来获取实例,这是一个时区。创建一个空的非抽象类,扩展要反序列化的抽象类,然后反序列化到其中。
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(TimeZone.class, new TimeZoneAdapter());

Gson gson = builder.create();