ジャージーを使用してWebアプリケーションを作成しています&ジャージー。私はホストされているAPIのResponse POJOを作った。私は以下のように、日付フィールドのためのカスタムジャクソンシリアライザを作った。カスタムjacksonシリアライザがgsonと連携していません
class A{
LocalDateTime localDateTime = LocalDateTime.now();
@JsonSerialize(using = JacksonSerializers.DateSecondsFromEpochUTCSerializer.class)
public LocalDateTime getLocalDateTime() {
return localDateTime;
}
public void setLocalDateTime(LocalDateTime localDateTime) {
this.localDateTime = localDateTime;
}
}
シリアライザは以下の通りです:
public class JacksonSerializers {
@Component
public static class DateSecondsFromEpochUTCSerializer extends JsonSerializer<LocalDateTime> {
@Override
public void serialize(LocalDateTime localDateTime, JsonGenerator gen, SerializerProvider provider)
throws IOException, JsonProcessingException {
gen.writeNumber(localDateTime.toEpochSecond(ZoneOffset.UTC));
}
}
APIが呼び出されたときに上記のコードは正常に動作していると応答がエポック形式で日付が含まれています。
しかし、私がGSONライブラリを使ってクラスのJSONを作成しようとしているとき、上記のシリアライゼーションは機能しません。私は以下の誤った出力を取得しています:
System.out.print(new Gson().toJson(new A()));
は
{"localDateTime":{"date":{"year":2017,"month":1,"day":31},"time":{"hour":12,"minute":55,"second":53,"nano":481000000}}}
を与えるしかし、私は1485847871
をしたいです。基本的には、どちらのフローでも、エポック時間でLocalDateTimeをシリアル化する必要があります。私はGSONを使ってやろうとしていますが、ハードコアの要件ではありません。両方の結果を達成するためのエレガントなソリューションがあれば可能です。
「GSONを使用してLocalDateTimeをエポック形式にシリアル化するにはどうすればよいですか?なぜジャクソンの部分は、明らかに意図どおりに動作し、質問の一部でさえあるのでしょうか? – Henrik
それは私が尋ねることではないからです。私はすでに、ジャージーを使ってLocalDateTimeをエポック形式に解析することができます。今、私はいくつかの他のタスクのために同じPOJOを使用しています。今回は、GSONを使用してPOJOをJSONにシリアル化しています。このメソッドは、Jacksonが作成しているのと同様の望ましい結果を生成しません。私は、両方の問題が同時に実行されなければならないので、両方の問題に対する共通の解決策を望んでいました。 –
ObjectMapper(Jackson)は両方の問題を解決しました。後者は前提条件を持っていました。つまり、ジャクソンを使って以前のシリアライズを変更することはできませんでしたが、後者は –