簡體   English   中英

使用 Jackson 將 java.time.Duration 僅以毫秒為單位序列化為 json

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM