【问题标题】:Serialize java.time.Duration to json as milliseconds only, using Jackson使用 Jackson 将 java.time.Duration 序列化为仅以毫秒为单位的 json
【发布时间】:2021-11-30 14:19:33
【问题描述】:

我正在尝试找到一种方法来配置对象序列化过程(使用 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 的自定义序列化程序,但这种方法破坏了与使用 Duration 的其他类相关的测试。

我拥有的Jackson库的版本是:2.12.4

【问题讨论】:

  • 我认为你的 SomeEvent 类中不应该有 Duration 对象。改用number type,然后用Duration.ofMillis() 填充它。测试了你的代码,我得到了这个:{"durationOfEvent":{"seconds":0,"units":["SECONDS","NANOS"],"zero":false,"negative":false,"nano":500000000}}

标签: java serialization jackson java-time jackson2


【解决方案1】:

你可以通过告诉杰克逊来实现这一点 你想要Duration durationOfEvent 属性 由您自己的序列化程序序列化。 您可以通过添加 @JsonSerialize annotation 到 您班级中的属性SomeEvent

@JsonSerialize(using = MyDurationSerializer.class)
private Duration durationOfEvent;

您可以将您的序列化程序实现为非常简单的 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}

【讨论】:

    猜你喜欢
    • 2017-12-29
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 2012-03-26
    相关资源
    最近更新 更多