如何使用杰克逊解析具有可变第二部分分数的RFC3339时间戳

时间:2019-07-02 12:57:25

标签: java datetime parsing jackson rfc3339

我正在尝试使用Jackson解析JSON字符串中RFC3339格式的时间戳。我如何在秒后考虑到可变的小数位数?

对于JSON文件

{
    "timestamp": "2019-07-02T13:00:34.836+02:00"
}

我已经在课程上反序列化了

public abstract class Attribute {
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
    public Date timestamp;
}

和带有JavaTimeModule的ObjectMapper

ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule());
mapper.readValue(jsonFile, Attribute.class);

这很好。但是,它也应适用于"timestamp": "2019-07-02T13:00:34+02:00""timestamp": "2019-07-02T13:00:34.090909090+02:00"。我发现this answer展示了如何使用DateTimeFormatter解析此类字符串,但据我所知,@JsonFormat只需要一个SimpleDateFormat字符串,该字符串不支持可变数量的第二位小数。

一起删除pattern属性,因此注释变为

@JsonFormat(shape = JsonFormat.Shape.STRING)

允许我解析传入的日期,但也接受非RFC3339时间戳,例如1990-01-01T12:53:01-0110(在时区中缺少冒号)。

1 个答案:

答案 0 :(得分:2)

在您的JavaTimeModule中注册了ObjectMapper之后,只需使用OffsetDateTime而不是Date。不需要@JsonFormat

请参见以下示例:

@Data
public class Foo {
    private OffsetDateTime timestamp;
}
String json =
        "{\n" +
        "  \"timestamp\": \"2019-07-02T13:00:34.090909090+02:00\"\n" +
        "}\n";

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());

Foo foo = mapper.readValue(json, Foo.class);