web-dev-qa-db-ja.com

LocalDateTime-LocalDateTime.parseによる逆シリアル化

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;
_
17
Andrew Tobilko

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

箱から出して。

27

カスタムの日時形式を解析したい人向け。

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;
}
6
Yan Khonski