说明
我是Java和Jackson的新手,我尝试将java.time.duration
保存到JSON中,格式为漂亮且可读的hh:mm(小时:分钟),以便存储和检索。
在我的项目中,我使用:
- Jackson
com.fasterxml.jackson.core:jackson-databind:2.14.1
。 - Jackson
com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.14.1
,用于支持较新的Java 8时间/日期类。
最小工作示例:
考虑以下示例类:
public class Book {
private Duration timeToComplete;
public Book(Duration durationToComplete) {
this.timeToComplete = durationToComplete;
}
// default constructor + getter & setter
}
如果我尝试将book示例序列化为JSON,如以下代码部分所示
public class JavaToJson throws JsonProcessingException {
public static void main(String[] args) {
// create the instance of Book, duration 01h:11min
LocalTime startTime = LocalTime.of(13,30);
LocalTime endTime = LocalTime.of(14,41);
Book firstBook = new Book(Duration.between(startTime, endTime));
// create the mapper, add the java8 time support module and enable pretty parsing
ObjectMapper objectMapper = JsonMapper.builder()
.addModule(new JavaTimeModule())
.build()
.enable(SerializationFeature.INDENT_OUTPUT);
// serialize and print to console
System.out.println(objectMapper.writeValueAsString(firstBook));
}
}
它给出的持续时间单位是秒而不是01:11
。
{
"timeToComplete" : 4740.000000000
}
如何将JSON输出更改为hh:mm格式?
直到现在我所尝试的
我考虑过在ObjectMapper的示例化过程中添加一个自定义的串行化器/反串行化器(可能是DurationSerializer
?),但似乎我无法使格式工作...
ObjectMapper objectMapper = JsonMapper.builder()
.addModule(new JavaTimeModule())
// add the custom serializer for the duration
.addModule(new SimpleModule().addSerializer(new DurationSerializer(){
@Override
protected DurationSerializer withFormat(Boolean useTimestamp, DateTimeFormatter dtf, JsonFormat.Shape shape) {
// here I try to change the formatting
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm");
return super.withFormat(useTimestamp, dtf, shape);
}
}))
.build()
.enable(SerializationFeature.INDENT_OUTPUT);
它所做的只是将其更改为Duration的以下奇怪文本表示:
{
"timeToComplete" : "PT1H11M"
}
所以看起来我还没有完全关闭,但是格式仍然没有。也许有人可以帮助序列化/反序列化?
多谢了
1条答案
按热度按时间zxlwwiss1#
Jackson
不支持hh:mm
,因为默认情况下Java
不识别该格式。我们需要自定义序列化/反序列化机制并提供自定义实现。请看:
使用链接文章中的一些例子,我创建了自定义的序列化器和反序列化器。它们不能处理所有可能的情况,但应该能满足您的需求:
以上代码打印: