当我试图反序列化这个属性时,我出错了:
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
private LocalDateTime deliveryDate;
这是反序列化类:
public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
@Override
public LocalDateTime deserialize(JsonParser parser, DeserializationContext context) throws IOException {
if (parser.getCurrentToken().equals(JsonToken.VALUE_STRING)) {
String rawDate = parser.getText();
return LocalDateTime.parse(rawDate);
} else {
throw context.wrongTokenException(parser, JsonToken.VALUE_STRING, "Expected string.");
}
}
以及序列化类:
public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
@Override
public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString(value.toString());
}
这是我得到的错误:
"timestamp":1513962011642,"status":400,"error":"Bad Request","exception":"org.springframework.http.converter.HttpMessageNotReadableException","message":"Could not read document: Text '2017-12-22T16:00:00.874Z' could not be parsed, unparsed text found at index 23
你知道为什么吗?
谢谢!
发布于 2017-12-22 09:54:50
tl;dr
进程是一个Instant
而不是LocalDateTime
。
Instant.parse( "2017-12-22T16:00:00.874Z" )
详细信息
不确定来自JSON的原始数据。如果您的输入数据是1513962011642
,那么它似乎是一个自一个时代以来的计数,大概是1970-01-01T00:00:00Z的划时代参考日期,这是1970年世界协调时的第一个时刻。
Instant instant = Instant.ofEpochMilli( 1_513_962_011_642L ) ;
如果原始输入是2017-12-22T16:00:00.874Z
,则直接解析为Instant
。该字符串采用标准ISO 8601格式。末尾的Z
是Zulu
的缩写,意思是UTC。
java.time类在解析/生成字符串时默认使用标准格式。
Instant instant = Instant.parse( "2017-12-22T16:00:00.874Z" ) ;
LocalDateTime
故意缺乏时区或从世界协调时抵消的任何概念,因此它并不代表实际的时刻,也不是时间线上的一个点。您错误地试图将您的值匹配到错误的类中,在这个类中,它是一个UTC值无法表示。
发布于 2017-12-22 09:31:06
实际上,这个错误非常简单,它说spring不能将这个字符串"2017-12-22T16:00:00.874Z"
反序列化为LocalDateTime
。如果要运行下一段代码,您将看到相同的错误:
public static void main(String[] args) {
System.out.println(LocalDateTime.parse("2017-12-22T16:00:00.874Z"));
}
错误的来源是索引23处的字符'Z'
。如果要删除这个字符,上面的代码就可以工作了。因此,我建议您检查为什么这个'Z'
字符存在于字符串中,而您的序列化程序不添加它。
https://stackoverflow.com/questions/47945123
复制相似问题