java - 使用 Jackson 将 Java8 LocalDateTime 序列化为 UTC 时间戳

标签 java datetime java-8 jackson java-time

我刚刚根据新的(ish)java 8 时间包将我的许多日期转换为 LocalDateTime。在我开始尝试序列化和反序列化之前,我一直很喜欢这种转换。

我如何配置 Jackson 来支持它们?:

LocalDateTime --serialize--> UTC 时间戳 --deserialize--> LocalDateTime?

这里有很多关于转换为格式化字符串的资料,但我似乎找不到针对 utc 时间戳的现成解决方案。

最佳答案

您可以为 LocalDateTime 自定义序列化器和反序列化器,例如:

CustomLocalDateTimeSerializer

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;

import java.io.IOException;
import java.time.LocalDateTime;
import java.time.ZoneId;

public class CustomLocalDateTimeSerializer extends StdSerializer<LocalDateTime> {

    protected CustomLocalDateTimeSerializer(Class<LocalDateTime> t) {
        super(t);
    }

    protected CustomLocalDateTimeSerializer() {
        this(null);
    }

    @Override
    public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider sp)
            throws IOException {
        Long epoch = value.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond();
        gen.writeString(epoch.toString());
    }
}

CustomLocalDateTimeDesSerializer:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;

import java.io.IOException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;

class CustomLocalDateTimeDesSerializer extends StdDeserializer<LocalDateTime> {

    protected CustomLocalDateTimeDesSerializer() {
        this(null);
    }

    protected CustomLocalDateTimeDesSerializer(Class<LocalDateTime> t) {
        super(t);
    }

    @Override
    public LocalDateTime deserialize(JsonParser jsonparser, DeserializationContext context)
            throws IOException {
        Long timestamp = Long.parseLong(jsonparser.getText());
        return LocalDateTime.ofInstant(Instant.ofEpochSecond(timestamp), ZoneId.systemDefault());
    }
}

并使用它们:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

import java.time.LocalDateTime;

public class RestObject {

    private LocalDateTime timestamp = LocalDateTime.now();

    @JsonSerialize(using = CustomLocalDateTimeSerializer.class)
    @JsonDeserialize(using = CustomLocalDateTimeDesSerializer.class)
    public LocalDateTime getTimestamp() {
        return timestamp;
    }

    public static void main(String[] args) throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();
        // {"timestamp":"1549026058"}
        System.out.println(objectMapper.writeValueAsString(new RestObject()));
    }
}

关于java - 使用 Jackson 将 Java8 LocalDateTime 序列化为 UTC 时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54479704/

相关文章:

java - 从 Java 访问 gradle 资源

java - 从 Java 函数和属性运行 JMeter 脚本时不起作用

java - 使用JodaTime将UTC转换为以毫秒为单位的本地时间

java - 自定义对象上的流过滤器多维数组给定范围

java - 我的多线程 "fizz buzz"实现线程安全吗?

java - 无法使用 JAX-RS Jersey 2.3.1 和 Tomcat 7 使 ChunkedOutput 工作

以天为单位的 SQL 日期差异结果错误

javascript - 多个 JavaScript 倒计时日期?

java - 设计决策 - Math.java 中单独的 RandomNumberGenerator Holder 类的用途/优势是什么?

Java 8 Stream List<Foo> 到 Map<Date, Map<String,Long>> 与条件 groupingBy