JacksonMapper Десериализация даты с часовым поясом UTC завершается неудачей с данным форматом - PullRequest
0 голосов
/ 20 ноября 2018

Я знаю, что есть много повторяющихся вопросов об одной и той же проблеме, однако я не смог десериализовать данный формат даты в объект java.util.Date. Клиентский API, который я использую, возвращает поля даты с 6 цифрами в сочетании с миллисекундами и наносекундами.

  • 2016-12-08T20: 09: 05.508883Z
  • 2016-12-08T20: 09: 05.527Z

Иногда это включает нано секунды, иногда нет. Я пытался следовать примерам десериализации из самой библиотеки jackson-databind , однако не смог найти обходной путь. Скажи, что это пример json blob

{
    "id": "68e6a28f-ae28-4788-8d4f-5ab4e5e5ae08",
    "created_at": "2016-12-08T20:09:05.508883Z",
    "done_at": "2016-12-08T20:09:05.527Z"
}

Entity.java

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class OrderResponse {
    private String id;

    @JsonProperty("created_at")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss'*'", timezone = "UTC")
    private Date createdAt;

    @JsonProperty("done_at")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss'*'", timezone = "UTC")
    private Date doneAt;
}

Если я использую только формат yyyy-MM-dd'T'HH:mm:ss, Джексон Маппер десериализует с часовым поясом, исходящим от самого jvm. Но мне нужно использовать формат UTC, и я попытался также реализовать собственный десериализатор и сериализатор, который также не работает. У меня вопрос java.util.Date правильный тип объекта? Кроме того, я также попытался создать свой собственный объектный преобразователь с регистрацией new JavaTimeModule(), но это не сработало.

Спасибо за помощь.

1 Ответ

0 голосов
/ 20 ноября 2018

Я обнаружил, что java.time.format.DateTimeFormatter имеет тип формата ISO_INSTANT, который поддерживает формат, который я искал.

https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#ISO_INSTANT

По сути, я написал свой собственный десериализатор

public class CustomInstantDeserializer extends JsonDeserializer<Instant> {

    private DateTimeFormatter fmt = DateTimeFormatter.ISO_INSTANT.withZone(ZoneOffset.UTC);

    @Override
    public Instant deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        return Instant.from(fmt.parse(p.getText()));
    }
}

с аннотацией @JsonDeserialize в связанном поле.

@JsonProperty("created_at")
@JsonDeserialize(using = CustomInstantDeserializer.class)
private Instant createdAt;
...