要从
LocalDateTime纪元的毫秒数开始构建,
1970-01-01T00:00:00Z我们需要一个时区。在2.9.9版中,当出现毫秒时,它将引发异常:
不允许使用原始时间戳(1563448935000)
java.time.LocalDateTime:需要其他信息,例如偏移量或时区(请参阅类Javadocs)
但是我们可以实现我们的反序列化程序,它将尝试使用默认时区进行此操作。示例实现如下所示:
class MillisOrLocalDateTimeDeserializer extends LocalDateTimeDeserializer { public MillisOrLocalDateTimeDeserializer() { super(DateTimeFormatter.ISO_LOCAL_DATE_TIME); } @Override public LocalDateTime deserialize(JsonParser parser, DeserializationContext context) throws IOException { if (parser.hasToken(JsonToken.VALUE_NUMBER_INT)) { long value = parser.getValueAsLong(); Instant instant = Instant.ofEpochMilli(value); return LocalDateTime.ofInstant(instant, ZoneOffset.UTC); } return super.deserialize(parser, context); }}ZoneOffset.UTC用来。您可以根据自己的意愿提供或使用系统默认值。用法示例:
import com.fasterxml.jackson.core.JsonParser;import com.fasterxml.jackson.core.JsonToken;import com.fasterxml.jackson.databind.DeserializationContext;import com.fasterxml.jackson.databind.ObjectMapper;import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;import java.io.IOException;import java.time.Instant;import java.time.LocalDateTime;import java.time.ZoneOffset;import java.time.format.DateTimeFormatter;public class JsonApp { public static void main(String[] args) throws Exception { JavaTimeModule javaTimeModule = new JavaTimeModule(); // override default javaTimeModule.addDeserializer(LocalDateTime.class, new MillisOrLocalDateTimeDeserializer()); ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(javaTimeModule); String json = "{"created":1563448935000}"; System.out.println(mapper.readValue(json, Created.class)); }}class Created { private LocalDateTime created; // getters, setters, toString}上面的代码打印:
Created{created=2019-07-18T11:22:15}编辑:使用
Jackson 2.9.0,由于这个问题,提供的代码将不会被调用,因为
findAndRegisterModules在注册自定义模块后,它将被覆盖。删除该呼叫将使整个方案起作用。如果以上方法不适用于您的版本,则需要调试默认实现并查找原因。



