initiationDate
クラスでISO-8601形式にシリアル化するフィールドToStringSerializer
があります。
_@JsonSerialize(using = ToStringSerializer.class)
private LocalDateTime initiationDate;
_
次のJSONを受信すると、
_...
"initiationDate": "2016-05-11T17:32:20.897",
...
_
LocalDateTime.parse(CharSequence text)
factoryメソッドでデシリアライズしたいです。私の試みはすべて_com.fasterxml.jackson.databind.JsonMappingException
_で終了しました:
型の値をインスタンス化できません[単純型、クラス_
Java.time.LocalDateTime
_]からString
値(_'2016-05-11T17:32:20.897'
_); single -String
コンストラクター/ファクトリーメソッドなし
どうすればそれを達成できますか?ファクトリメソッドを指定するにはどうすればよいですか?
編集:
この問題は、プロジェクトに jackson-datatype-jsr310モジュール を含め、LocalDateTimeDeserializer
で_@JsonDeserialize
_を使用することで解決されました。
_@JsonSerialize(using = ToStringSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime initiationDate;
_
Vanilla Jacksonには、JSON文字列値からLocalDateTime
オブジェクトをdeserializeする方法がありません。
いくつかのオプションがあります。 LocalDateTime#parse
を使用する独自のJsonDeserializer
を作成および登録できます。
class ParseDeserializer extends StdDeserializer<LocalDateTime> {
public ParseDeserializer() {
super(LocalDateTime.class);
}
@Override
public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
return LocalDateTime.parse(p.getValueAsString()); // or overloaded with an appropriate format
}
}
...
@JsonSerialize(using = ToStringSerializer.class)
@JsonDeserialize(using = ParseDeserializer.class)
private LocalDateTime initiationDate;
または、クラスパスに JacksonのJava.time
拡張 を追加して、Module
に適切なObjectMapper
を登録できます。
objectMapper.registerModule(new JavaTimeModule());
ジャクソンにあなたのために変換をさせてください。内部的には、これはLocalDateTime#parse
を標準形式のいずれかで使用します。幸いなことに、次のような値をサポートしています
2016-05-11T17:32:20.897
箱から出して。
カスタムの日時形式を解析したい人向け。
1)依存関係を追加
compile "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.8.8"
2)日時形式のJSONアノテーション
public class ClientRestObject {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime timestamp;
}
3)ObjectMapperにJava8モジュールを登録する
private static ObjectMapper buildObjectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
//To parse LocalDateTime
objectMapper.registerModule(new JavaTimeModule());
return objectMapper;
}