当前位置: 首页 > 知识库问答 >
问题:

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

曹原
2023-03-14

我使用的是Java 8和GSON的最新发布版本(通过Maven)。如果序列化localdate,将得到如下内容

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

我更喜欢“birthday”:“1997-11-25”。Gson是否也支持更简洁的开箱即用格式,还是必须为localdates实现自定义序列化器?

(我尝试过gsonBuilder.setDateFormat(dateFormat.short),但似乎没有什么作用。)

共有2个答案

宋琛
2023-03-14

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

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())
宰父玄天
2023-03-14

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

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();
 类似资料:
  • 问题内容: 我正在使用Java 8和Gson的最新版本(通过Maven)。如果我序列化一个,我会得到这样的东西 我本来喜欢的地方。Gson是否还支持开箱即用的更简洁格式,还是我必须为s 实现自定义序列化程序? (我已经尝试过了,但这似乎没有什么不同。) 问题答案: 直到另行通知,我已经实现了一个自定义序列化器,如下所示: 它可以像这样安装:

  • 问题内容: 我有一个格式。我希望它采用以下格式 以下是我尝试进行此转换的示例: 我得到的输出仍然不是格式。 请让我知道如何格式化从到 问题答案: 是自Unix纪元(1970年1月1日UTC:00:00)以来的毫秒数的容器。 它没有格式的概念。 输出…

  • 问题内容: 好吧,我正在使用a进行详细说明,因为我从数据库中获取了一个对象,并且从同一对象中获得了一个变量“ fecha”(日期),因此我得到了a ,因此formatt以毫秒为单位,但是我不想出现毫秒。因此,我需要将我从数据库中收到的日期格式化为没有毫秒的新日期。 这是对象Factura: 在映射到数据库的xml中,我具有该变量“ fecha”的代码: 在数据库中,该列为。 当我从数据库中获取一个

  • 我想将日期从07/02/2019转换为2019年7月07日。我的输入值是07/02/2019我想与目标值2019年7月07日进行比较.....请帮助我... public static void main(string[]args)引发ParseException{ 输出:Mon Jul 01 00:00:00 IST 2019这不是我的期望值

  • 问题内容: 有人可以让我知道吗,如何在Java 中将日期格式转换为日期, 在输入和输出日期中都应为Strings。 我用过apache,但是在输出中没有毫秒数。 问题答案: 您还可以在Java 8中使用更新的Time API ,类似… 哪个输出… 这使您对管理时区负有更多责任,通常这可能是一个更好的解决方案 而且因为在Java 8 API中的时区之间进行转换使我很头疼(缺乏经验:P) 哪个输出…

  • 我正在使用gson进行改造,将json反序列化为领域对象。这在大多数情况下都很有效。处理问题时会出现麻烦 RealmList(字符串(或任何其他基本数据类型)) 由于Realm不支持RealmList,其中E不扩展Realm对象,所以我将字符串包装在RealmObject中。 我的领域对象如下 SimpleRealmObj工作正常,因为它只有字符串元素 如何反序列化stringStuff?我试过使