gpt4 book ai didi

java - 自定义 Jackson 序列化器无法与 gson 一起使用

转载 作者:行者123 更新时间:2023-12-01 08:57:32 24 4
gpt4 key购买 nike

我正在使用 Jackson & Jersey 制作一个网络应用程序。我已经为托管的 API 制作了响应 POJO。我为日期字段制作了一个自定义 Jackson 序列化器,如下所示。

class A{
LocalDateTime localDateTime = LocalDateTime.now();

@JsonSerialize(using = JacksonSerializers.DateSecondsFromEpochUTCSerializer.class)
public LocalDateTime getLocalDateTime() {
return localDateTime;
}

public void setLocalDateTime(LocalDateTime localDateTime) {
this.localDateTime = localDateTime;
}
}

序列化器如下:

public class JacksonSerializers {

@Component
public static class DateSecondsFromEpochUTCSerializer extends JsonSerializer<LocalDateTime> {

@Override
public void serialize(LocalDateTime localDateTime, JsonGenerator gen, SerializerProvider provider)
throws IOException, JsonProcessingException {
gen.writeNumber(localDateTime.toEpochSecond(ZoneOffset.UTC));
}

}

当调用 API 并且响应包含纪元格式的日期时,上述代码工作正常。

但是,当我尝试使用 GSON lib 制作该类的 JSON 时,上述序列化不起作用。我得到以下不正确的输出:

System.out.print(new Gson().toJson(new A()));

给出

{"localDateTime":{"date":{"year":2017,"month":1,"day":31},"time":{"hour":12,"minute":55,"second":53,"nano":481000000}}}

但我想要1485847871。基本上,我想在两个流中以纪元时间序列化 LocalDateTime。我现在正在尝试使用 GSON,但这不是硬核要求。任何能够实现这两个结果的优雅解决方案都可以。

最佳答案

可以创建一个可用于 Jackson 和 GSON 的统一序列化器。类似这样的事情:

public class DateSecondsFromEpochUTCSerializer
extends com.fasterxml.jackson.databind.JsonSerializer<LocalDateTime>
implements com.google.gson.JsonSerializer<LocalDateTime> {

@Override
public void serialize(LocalDateTime localDateTime, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeNumber(convert(localDateTime));
}

@Override
public JsonElement serialize(LocalDateTime ldt, Type type, JsonSerializationContext jsonSerializationContext) {
return new JsonPrimitive(convert(ldt));
}

private long convert(LocalDateTime ldt) {
return ldt.toEpochSecond(ZoneOffset.UTC);
}
}

将其安装在您的 GSON 实例中,如下所示:

Gson gson = new GsonBuilder()
.registerTypeAdapter(LocalDateTime.class, new DateSecondsFromEpochUTCSerializer())
.create();
System.out.println(gson.toJson(LocalDateTime.now())); // Epoch

关于java - 自定义 Jackson 序列化器无法与 gson 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41951937/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com