Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Jackson反序列化LocalDateTime_Java_Date_Jackson - Fatal编程技术网

Java 使用Jackson反序列化LocalDateTime

Java 使用Jackson反序列化LocalDateTime,java,date,jackson,Java,Date,Jackson,尝试反序列化此属性时出错: @JsonDeserialize(using = LocalDateTimeDeserializer.class) @JsonSerialize(using = LocalDateTimeSerializer.class) private LocalDateTime deliveryDate; 这是反序列化类: public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTi

尝试反序列化此属性时出错:

@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());
    }
你知道为什么吗


谢谢

实际上错误非常简单,它说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'
字符,而序列化程序没有添加它。

tl;博士 作为一个过程,而不是

细节 不确定您的原始数据是否来自JSON。如果您的输入数据是
1513962011642
,则它似乎是从一个纪元开始的计数,可能是1970-01-01T00:00:00Z,即UTC中1970年的第一个时刻

Instant instant = Instant.ofEpochMilli( 1_513_962_011_642L ) ;
如果原始输入是
2017-12-22T16:00:00.874Z
,则直接解析为
即时
。该字符串是标准格式的。末尾的
Z
Zulu
的缩写,表示UTC

在解析/生成字符串时,java.time类默认使用标准格式

Instant instant = Instant.parse( "2017-12-22T16:00:00.874Z" ) ;
A故意缺少or的任何概念,因此它不代表实际的时刻,也不是时间线上的一个点。您错误地试图将您的值放入错误的类中,因为无法表示它是UTC值的事实


相反,将该输入作为
即时对象进行处理。瞬间表示时间线上分辨率为的点

糟糕的建议。丢弃
Z
就是丢弃信息,即该字符串表示UTC中的一个时刻。真正的问题是,输入应该作为
即时
处理,而不是作为
本地日期时间
处理。虽然我承认Z可以显示字符串,但我不建议删除它。问题不是这个角色存在的必要性。问题是-为什么会发生错误,答案是-反序列化程序无法反序列化此类字符串,因为存在在序列化过程中未添加的Z字符。建议是找出它存在的原因。服务器和客户端的格式不同可能是原因,但我不能像您这样分类,因为我没有足够的详细信息。感谢您的解释:)JSON中的实际原始数据可能存在重复?1513962011642?原始数据是2017-12-22T16:00:00.874Z
timestamp
1513962011642
是http请求的时间,与产生错误的文本日期字符串无关。感谢解释:)
Instant instant = Instant.ofEpochMilli( 1_513_962_011_642L ) ;
Instant instant = Instant.parse( "2017-12-22T16:00:00.874Z" ) ;