使用 Gson 将 Java 8 LocalDate 序列化为 yyyy-mm-dd

新手上路,请多包涵

我正在使用 Java 8 和 Gson 的最新版本 RELEASE 版本(通过 Maven)。如果我序列化一个 LocalDate 我得到这样的东西

"birthday": {
        "year": 1997,
        "month": 11,
        "day": 25
}

我更喜欢 "birthday": "1997-11-25" 。 Gson 是否也支持开箱即用的更简洁的格式,或者我是否必须为 LocalDate s 实现自定义序列化程序?

(我试过 gsonBuilder.setDateFormat(DateFormat.SHORT) ,但这似乎没有什么区别。)

原文由 Drux 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 791
2 个回答

在另行通知之前,我已经实现了一个自定义序列化程序,如下所示:

 class LocalDateAdapter implements JsonSerializer<LocalDate> {

    public JsonElement serialize(LocalDate date, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(date.format(DateTimeFormatter.ISO_LOCAL_DATE)); // "yyyy-mm-dd"
    }
}

它可以像这样安装:

 Gson gson = new GsonBuilder()
        .setPrettyPrinting()
        .registerTypeAdapter(LocalDate.class, new LocalDateAdapter())
        .create();

原文由 Drux 发布,翻译遵循 CC BY-SA 3.0 许可协议

我使用以下,支持读/写和空值:

 class LocalDateAdapter extends TypeAdapter<LocalDate> {
    @Override
    public void write(final JsonWriter jsonWriter, final LocalDate localDate) throws IOException {
        if (localDate == null) {
            jsonWriter.nullValue();
        } else {
            jsonWriter.value(localDate.toString());
        }
    }

    @Override
    public LocalDate read(final JsonReader jsonReader) throws IOException {
        if (jsonReader.peek() == JsonToken.NULL) {
            jsonReader.nextNull();
            return null;
        } else {
            return LocalDate.parse(jsonReader.nextString());
        }
    }
}

注册为@Drux 说:

 return new GsonBuilder()
        .registerTypeAdapter(LocalDate.class, new LocalDateAdapter())
        .create();

编辑 2019-04-04 更简单的实现

private static final class LocalDateAdapter extends TypeAdapter<LocalDate> {
    @Override
    public void write( final JsonWriter jsonWriter, final LocalDate localDate ) throws IOException {
        jsonWriter.value(localDate.toString());
    }

    @Override
    public LocalDate read( final JsonReader jsonReader ) throws IOException {
        return LocalDate.parse(jsonReader.nextString());
    }
}

您可以通过注册 nullSafe() 包装版本来添加 null 支持:

 new GsonBuilder()
      .registerTypeAdapter(LocalDate.class, new LocalDateAdapter().nullSafe())

原文由 Sam Barnum 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题