私は春のブートを使用してAPIを開発していますし、ペイロード(デ)シリアライズ用ジャクソンを使用しています。私はにISO-8601フォーマットされた日時をデシリアライズしたいjava.time.Instant
が、ミリ秒またはナノ秒単位でエポック時間から逆シリアル化をサポートする必要はありません。私は、クライアント・エラーの可能性を減らすために、1つのフォーマットで、私のAPIに提供されたデータをサポートしたいです。
現在、ジャクソンはISO-8601フォーマットされた文字列の両方からだけの数字などを含む文字列からインスタントにデシリアライズ"20190520"
。
そこジャクソン、私は私の上で使用することができます注釈されているInstant
フィールド、または私は行動のこの種を適用するように設定できるプロパティは?それとも私の唯一のオプションデシリアライザ習慣がありますか?
そこジャクソン私はインスタントフィールドに使用することができ、注釈、または私は行動のこの種を適用するように設定できるプロパティがありますか?それとも私の唯一のオプションデシリアライザ習慣がありますか?
私はあなたのために、このアウトオブボックスを行います注釈の個人的に知りません。しかし、次のように仕事をして、簡単なデシリアライザです。
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;
}
お役に立てれば。