java - Gson : Deserialize Json into Abstract Class

标签 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

最佳答案

您需要创建类似 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/

相关文章:

java - 每个窗口只打开一次

java - 处理相机调用并预览时出现 javaNullPointer 异常

java - 服务器无法读取全部内容

javascript - 将 JSON 响应转换为 JavaScript 中的正确编码

python - 带 FK 的 DRF POST 对象

java - Intellij 中的 Cucumber 未定义步骤引用

java - java中以给定速度将物体以直线从点(x1,y1)移动到点(x2,y2)的方法

java - 无法将数组的 JSON 数组解析为 Jackson 中的 LinkedHashMap

javascript - 在 AngularJS 中使用 $http.get 检索 JSON 时出现错误 400

c# - Asp.Net 核心 WebApi 模型状态不工作