2016-05-11 2 views
10

initiationDateのフィールドは、ToStringSerializerクラスからISO-8601フォーマットにシリアル化されています。LocalDateTime - LocalDateTime.parseによる逆シリアル化

@JsonSerialize(using = ToStringSerializer.class) 
private LocalDateTime initiationDate; 

私は、次のJSON、

... 
"initiationDate": "2016-05-11T17:32:20.897", 
... 

を受信したとき、私はLocalDateTime.parse(CharSequence text)ファクトリメソッドでそれをデシリアライズします。すべての私の試みはcom.fasterxml.jackson.databind.JsonMappingExceptionで終了:

String値('2016-05-11T17:32:20.897')からタイプ[単純型、クラスjava.time.LocalDateTime]の値をインスタンス化することはできません。いいえ単一のStringコンストラクタ/ファクトリメソッド

どのように達成できますか?ファクトリメソッドはどのように指定できますか?


EDIT:

問題は、プロジェクトへのjackson-datatype-jsr310 moduleを含むとLocalDateTimeDeserializer@JsonDeserializeを使用することによって解決されています。

@JsonSerialize(using = ToStringSerializer.class) 
@JsonDeserialize(using = LocalDateTimeDeserializer.class) 
private LocalDateTime initiationDate; 
+1

における登録Java8モジュール私はそれを知りませんそれは 'parse'を使いますが、適切な拡張子[ここ](https://github.com/FasterXML/jackson-datatype-jsr310)を追加しましたか? –

+1

@SotiriosDelimanolis、いいえ、私の問題をどうやって解決しますか?私はファクトリメソッドを指定する必要があります。 'LocalDateTime.parse(" 2016-05-11T17:32:20.897 ")'うまく動作します。 – Andrew

答えて

17

バニラ・ジャクソンは、任意のJSON文字列値からデシリアライズLocalDateTimeオブジェクトへの道を持っていません。

あなたはいくつかの選択肢があります。自分でJsonDeserializerを作成して登録することができ、LocalDateTime#parseを使用します。

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's java.time extensionを追加し、ObjectMapperで適切なModuleを登録することができます。

objectMapper.registerModule(new JavaTimeModule()); 

あなたに代わってジャクソンに変換をさせてください。内部的には、LocalDateTime#parseを標準形式の1つと組み合わせて使用​​します。幸いにも、

2016-05-11T17:32:20.897 

の値をサポートしています。

+1

ありがとうございます、2番目の方法は私のためにもっときれいです、私は '@ JsonDeserialize'モジュールの代わりに使用します – Andrew

+0

ええ、私はまた、2番目の方法を行った:objectMapper.registerModule(new JavaTimeModule());.私は投票した。 –

2

カスタム日付/時刻形式を解析するユーザー向けです。日時形式で

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

private static ObjectMapper buildObjectMapper() { 
    ObjectMapper objectMapper = new ObjectMapper(); 
    //To parse LocalDateTime 
    objectMapper.registerModule(new JavaTimeModule()); 
    return objectMapper; 
} 
+2

悲しいことに、それは仕事です:(返品する –

関連する問題