Как использовать Джексон для анализа метки времени RFC3339 с переменным числом секундных долей - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь проанализировать метки времени в формате RFC3339 в JSON-строке, используя Джексона.Как разрешить переменное количество десятичных знаков после секунд?

Для файла 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;
}

и ObjectMapper с JavaTimeModule:

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".Я нашел этот ответ , показывающий, как анализировать такие строки с DateTimeFormatter, но, насколько я могу судить, @JsonFormat принимает только строку SimpleDateFormat, которая не поддерживает переменные количествавторые десятичные знаки.

Удаление свойства pattern все вместе, поэтому аннотация становится

@JsonFormat(shape = JsonFormat.Shape.STRING)

, позволяет мне анализировать входящие даты, но также принимает не-RFC3339 временные метки, такие как 1990-01-01T12:53:01-0110 (пропуская двоеточие в часовом поясе).

1 Ответ

2 голосов
/ 02 июля 2019

Как только 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);
...