如何使用Jackson将指定java.time.Duration字段序列化为毫秒值
解决方案
你只需要给目标字段单独指定自定义序列化器即可,不会影响全局其他Duration类型字段的序列化逻辑:
步骤1:实现Duration转毫秒的自定义序列化器
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.std.StdSerializer; import java.io.IOException; import java.time.Duration; public class DurationToMillisSerializer extends StdSerializer<Duration> { public DurationToMillisSerializer() { super(Duration.class); } @Override public void serialize(Duration value, JsonGenerator gen, SerializerProvider provider) throws IOException { if (value == null) { gen.writeNull(); return; } // 直接输出毫秒值的长整型 gen.writeNumber(value.toMillis()); } }
步骤2:在目标字段上添加序列化注解
修改你的SomeEvent类,只在durationOfEvent字段上加@JsonSerialize注解绑定上述序列化器:
import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.time.Duration; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @Builder @Data @NoArgsConstructor @AllArgsConstructor public class SomeEvent { @JsonSerialize(using = DurationToMillisSerializer.class) private Duration durationOfEvent; }
验证效果
修改后运行你的测试代码,输出结果就会符合预期:
{"durationOfEvent":500}
注:该方案仅作用于当前加了注解的字段,完全不会影响项目中其他未加该注解的Duration类型字段的序列化逻辑,适配你使用的Jackson 2.12.4版本。
内容的提问来源于stack exchange,提问作者user3441604
相关产品推荐
相关产品推荐

