[英]Serialize java.time.Duration to json as milliseconds only, using Jackson
我試圖找到一種方法來配置對象序列化過程(使用 Jackson)以將 Duration 字段序列化為毫秒(不是秒 + 毫秒,這似乎是默認值)。
我有一個代表一些事件的類,例如:
import java.time.Duration;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SomeEvent {
private Duration durationOfEvent;
}
如果我運行以下代碼,它會創建一個實例並獲得一個 json 表示,然后我會得到如下所示的輸出
Duration duration = Duration.ofMillis(500);
SomeEvent someEvent = SomeEvent.builder().durationOfEvent(duration).build();
ObjectMapper objectMapper = enhancedObjectMapper();
String json = objectMapper.writeValueAsString(someEvent);
System.out.println(json);
輸出:
{"durationOfEvent":0.500000000}
我想獲得的是:
{"durationOfEvent":500}
我希望以毫秒為單位的原因是,使用 json 的過程可以比十進制數更容易處理毫秒。
我更願意為此類中的此特定字段添加一些注釋或自定義序列化,而不是為 java.time.Duration 的所有實例添加一些注釋或自定義序列化,因為應用程序中還有其他類也使用 Duration,我不想影響他們。 我之前嘗試過一個處理所有持續時間的客戶序列化程序,但這種方法破壞了與使用 Duration 的其他類相關的測試。
我擁有的傑克遜圖書館的版本是:2.12.4
您可以通過告訴 Jackson 您希望Duration durationOfEvent
屬性由您自己的序列化程序序列化來實現這一點。 您可以通過向類SomeEvent
的屬性添加@JsonSerialize
注釋來實現此SomeEvent
。
@JsonSerialize(using = MyDurationSerializer.class)
private Duration durationOfEvent;
您可以將序列化程序實現為JsonSerializer
一個非常簡單的子類, JsonSerializer
獲取毫秒並將其寫入為 JSON 數字。
public class MyDurationSerializer extends JsonSerializer<Duration> {
@Override
public void serialize(Duration value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
long milliseconds = value.toMillis();
gen.writeNumber(milliseconds);
}
}
然后 JSON 輸出將如下所示:
{"durationOfEvent":500}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.