Java 对自定义日期字符串使用Jackson JsonFormat模式
摘要 我试图解析日期,例如2017年9月25日,因此注释似乎是Java 对自定义日期字符串使用Jackson JsonFormat模式,java,json,jackson,Java,Json,Jackson,摘要 我试图解析日期,例如2017年9月25日,因此注释似乎是@JsonFormat(pattern=“dd/MMM/yy”)。然而,当我试图解析它时,我得到了一个InvalidFormatException,其本质是(下面的示例之后是完全异常): 我的日期格式字符串有什么问题?我看不出有什么问题。它看起来不像Sep与MMM配对 我使用的是Amazon Corretto Java版本“11.0.5”2019-10-15 LTS 复制示例 package example; import com.
@JsonFormat(pattern=“dd/MMM/yy”)
。然而,当我试图解析它时,我得到了一个InvalidFormatException,其本质是(下面的示例之后是完全异常):
我的日期格式字符串有什么问题?我看不出有什么问题。它看起来不像Sep
与MMM
配对
我使用的是Amazon Corretto Java版本“11.0.5”2019-10-15 LTS
复制示例
package example;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import java.time.LocalDate;
public class HelloMapperApp {
private static final ObjectMapper MAPPER = new ObjectMapper();
public static void main(String[] args) {
MAPPER.registerModule(new JavaTimeModule());
try {
Example example = MAPPER.readValue("{ \"name\": \"example\", \"date\": \"25/Sep/17\"", Example.class);
System.out.println("Deserialised is: " + example);
} catch (Exception e) {
throw new RuntimeException("Could not parse JSON: " + e);
}
}
static class Example {
@JsonProperty
String name;
@JsonProperty
@JsonFormat(pattern = "dd/MMM/yy")
LocalDate date;
@Override
public String toString() {
return String.format("name: %s%ndate: %s", name, date);
}
}
}
完全异常
Exception in thread "main" java.lang.RuntimeException: Could not parse JSON: com.fasterxml.jackson.databind.exc.InvalidFormatException:
Cannot deserialize value of type
`java.time.LocalDate` from String "25/Sep/17": Failed to deserialize java.time.LocalDate:
(java.time.format.DateTimeParseException) Text '25/Sep/17' could not be parsed at index 3
at [Source: (String)"{ "name": "example", "date": "25/Sep/17""; line: 1, column: 30] (through reference chain: example.HelloMapperApp$Example["date"])
at example.HelloMapperApp.main(HelloMapperApp.java:19)
可能是给定输入的格式与格式化程序使用的区域设置不符。是一个类似的帖子,其中有人对
Sep
有问题,格式化程序希望Sep.
用于Locale.CANADA
您可以查看如何设置格式化程序的区域设置。例如:
@JsonFormat(locale=“en”,pattern=“dd/MMM/yy”)
仅供参考:您不需要将
LLL
作为文本使用数月。看一看
数字/文本:如果图案字母的计数为3或更多,请使用上述文本规则。否则,请使用上面的数字规则
当您使用
MMM
时,即三次M
,格式化程序将隐式使用文本格式。我刚刚用常用的java.time
东西尝试了这一点,该模式适用于给定的输入。因为它适用于您,这给了我一个想法。我在Java8中尝试了上面的例子,效果很好。然而,在Java11中,它失败了,出现了上述错误。因此,它似乎是特定于Java11的。至少Corretto JDK 11不适用于上述示例。如果您有时间/兴趣,可以分享您尝试使用的Java版本吗?我使用了Java 11.0.3(Oracle)。我现在正在看。也许这是什么。试试@JsonFormat(locale=“en”,shape=JsonFormat.shape.STRING,pattern=“dd/MMM/yy”)
。这样做很有效,在这种情况下,拥有locale=“en”
可能是关键。我可以省去这个形状,只用@JsonFormat(locale=“en”,pattern=“dd/MMM/yy”)
就可以了。先前的答案(删除后)建议使用LLL
,因为它是本地日期。因此,在指定区域设置时,使用dd/LLL/yy
也是有效的。请随意添加答案。
Exception in thread "main" java.lang.RuntimeException: Could not parse JSON: com.fasterxml.jackson.databind.exc.InvalidFormatException:
Cannot deserialize value of type
`java.time.LocalDate` from String "25/Sep/17": Failed to deserialize java.time.LocalDate:
(java.time.format.DateTimeParseException) Text '25/Sep/17' could not be parsed at index 3
at [Source: (String)"{ "name": "example", "date": "25/Sep/17""; line: 1, column: 30] (through reference chain: example.HelloMapperApp$Example["date"])
at example.HelloMapperApp.main(HelloMapperApp.java:19)