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

时间:2016-08-02 20:55:22

标签: java json

我的json包含:

{"timeZone": "America/Los_Angeles"}

在许多其他键中,我想将其反序列化为java.util.TimeZoneTimeZone只是我想用这个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

1 个答案:

答案 0 :(得分:5)

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

希望这有帮助!