web-dev-qa-db-ja.com

ジャクソンでLocalDateTimeをシリアル化する方法?

次のコードを取得しました。

    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(new JavaTimeModule());
    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    String now = new ObjectMapper().writeValueAsString(new SomeClass(LocalDateTime.now()));
    System.out.println(now);

そして私はこれを手に入れます:

{"時間":{"時間":20、 "分":49、 "秒":42、 "ナノ":99000000、 "dayOfYear":19、 "dayOfWeek": "THURSDAY"、 "月": "1月"、" dayOfMonth ":19、" year ":2017、" monthValue ":1、" chronology ":{" id ":" ISO "、" calendarType ":" iso8601 "}}}

私が達成したいのはISO8601の文字列です

2017-01-19T18:36:51Z

9
user1745356

これはおそらく、コードの誤りが原因です。あなたはマッパーの新しい未設定のインスタンスを使用していました、これが修正です:

 ObjectMapper mapper = new ObjectMapper();
 mapper.registerModule(new JavaTimeModule());
 mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
 String now = mapper.writeValueAsString(new SomeClass(LocalDateTime.now()));
 System.out.println(now);
20

これがOffsetDateTimeにできることです:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "uuuu-MM-dd'T'HH:mm:ss.SSSXXXX")
private OffsetDateTime timeOfBirth;

LocalDateTimeの場合、オフセット情報がないため、XXXX(ゾーンオフセット)を使用できません。だからあなたはそれを落とすことができます。しかし ISO8601はローカル時間の使用を推奨しません あいまいであるため:

時間表現でUTC関係情報が指定されていない場合、時間は現地時間であると見なされます。同じタイムゾーンで通信する場合は現地時間であると想定しても安全かもしれませんが、異なるタイムゾーン間で通信する場合に使用するとあいまいになります。単一の地理的タイムゾーン内であっても、地域が夏時間を遵守している場合、一部の現地時間はあいまいになります。通常は、標準の表記法を使用してタイムゾーンを示すことが望ましい(ゾーン指定子)です。