エポックミリ秒からインスタントをデシリアライズからジャクソンを無効にする方法?

Didacticus:

私は春のブートを使用してAPIを開発していますし、ペイロード(デ)シリアライズ用ジャクソンを使用しています。私はにISO-8601フォーマットされた日時をデシリアライズしたいjava.time.Instantが、ミリ秒またはナノ秒単位でエポック時間から逆シリアル化をサポートする必要はありません。私は、クライアント・エラーの可能性を減らすために、1つのフォーマットで、私のAPIに提供されたデータをサポートしたいです。

現在、ジャクソンはISO-8601フォーマットされた文字列の両方からだけの数字などを含む文字列からインスタントにデシリアライズ"20190520"

そこジャクソン、私は私の上で使用することができます注釈されているInstantフィールド、または私は行動のこの種を適用するように設定できるプロパティは?それとも私の唯一のオプションデシリアライザ習慣がありますか?

マルコ・R:

そこジャクソン私はインスタントフィールドに使用することができ、注釈、または私は行動のこの種を適用するように設定できるプロパティがありますか?それとも私の唯一のオプションデシリアライザ習慣がありますか?

私はあなたのために、このアウトオブボックスを行います注釈の個人的に知りません。しかし、次のように仕事をして、簡単なデシリアライザです。

import java.io.IOException;
import java.time.Instant;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;

public class JacksonInstantDeserializer extends StdDeserializer<Instant> {
    public JacksonInstantDeserializer() { this(null); }
    public JacksonInstantDeserializer(Class<?> clazz) { super(clazz); }

    @Override
    public Instant deserialize(JsonParser parser, DeserializationContext ctx) throws IOException {
        return Instant.parse(parser.getText());
    }
}

それは基本的に使用していますInstant.parseこれは受け入れONLY ISO-8601フォーマットされた文字列を(それがスローされますDateTimeParseException文字列がそれに応じてフォーマットされていない場合)、作成しInstantその表現に基づきます。その後、デシリアライズするために、このコンバータを使用するためにジャクソンを教えて使用することができInstant、次のようにあなたのDTOのプロパティを:

    public class MyDTO {
        @JsonDeserialize(using = JacksonInstantDeserializer.class)
        public Instant instant;
    }

GitHubの上の完全なコード

お役に立てれば。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=171439&siteId=1