DaT*_*val 3 java duration jackson deserialization jackson-modules
我需要为项目设置可配置的超时,该项目从 YAML 文件读取不同的配置。
我注意到Jackson 使用parsejava.time.Duration方法来反序列化持续时间字符串。问题在于它使用 ISO-8601 格式并期望持续时间具有格式。虽然遵循标准是个好主意,但要求人们提供超时并不是最好的选择,而是首选。PnDTnHnMn.nSPT10M10m
我确实为持续时间字段编写了一个自定义反序列化器,但奇怪的是杰克逊默认情况下无法处理这个问题。
10m反序列化人类友好以及使用Jackson ObjectMapper5s的最简单方法是什么?1hjava.time.Duration
“最简单”的反序列化方式对人类友好10m,5s并且1h可能是正则表达式和 Java 代码的组合。
public static Duration parseHuman(String text) {
Matcher m = Pattern.compile("\\s*(?:(\\d+)\\s*(?:hours?|hrs?|h))?" +
"\\s*(?:(\\d+)\\s*(?:minutes?|mins?|m))?" +
"\\s*(?:(\\d+)\\s*(?:seconds?|secs?|s))?" +
"\\s*", Pattern.CASE_INSENSITIVE)
.matcher(text);
if (! m.matches())
throw new IllegalArgumentException("Not valid duration: " + text);
int hours = (m.start(1) == -1 ? 0 : Integer.parseInt(m.group(1)));
int mins = (m.start(2) == -1 ? 0 : Integer.parseInt(m.group(2)));
int secs = (m.start(3) == -1 ? 0 : Integer.parseInt(m.group(3)));
return Duration.ofSeconds((hours * 60L + mins) * 60L + secs);
}
Run Code Online (Sandbox Code Playgroud)
测试
System.out.println(parseHuman("1h"));
System.out.println(parseHuman("1 hour 200 minutes"));
System.out.println(parseHuman("3600 secs"));
System.out.println(parseHuman("2h3m4s"));
Run Code Online (Sandbox Code Playgroud)
输出
public static Duration parseHuman(String text) {
Matcher m = Pattern.compile("\\s*(?:(\\d+)\\s*(?:hours?|hrs?|h))?" +
"\\s*(?:(\\d+)\\s*(?:minutes?|mins?|m))?" +
"\\s*(?:(\\d+)\\s*(?:seconds?|secs?|s))?" +
"\\s*", Pattern.CASE_INSENSITIVE)
.matcher(text);
if (! m.matches())
throw new IllegalArgumentException("Not valid duration: " + text);
int hours = (m.start(1) == -1 ? 0 : Integer.parseInt(m.group(1)));
int mins = (m.start(2) == -1 ? 0 : Integer.parseInt(m.group(2)));
int secs = (m.start(3) == -1 ? 0 : Integer.parseInt(m.group(3)));
return Duration.ofSeconds((hours * 60L + mins) * 60L + secs);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1862 次 |
| 最近记录: |