gpt4 book ai didi

javascript - 将 json 日期转换为 Jackson 的众多日期之一

转载 作者:太空宇宙 更新时间:2023-11-04 16:11:01 24 4
gpt4 key购买 nike

我有一个 spring boot 1.3.5 应用程序,它使用 jackson 作为:

"com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.5.0"

我看到的问题是,当用户输入与预期格式不同的值(mm/dd/yyyy)并执行 POST 时,我会收到返回到 UI 的严重错误(服务器日志中没有显示任何内容) ):

Could not read document: Text '08-21-1999' could not be parsed at index 2 (through reference chain: com.xxx.yyy.MyDTO[\"firstofficevisit\"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Text '08-21-1999' could not be parsed at index 2 (through reference chain: com.xxx.yyy.MyDTO[\"firstofficevisit\"])

这里是提交的 json,其中 dateOfBirth 有效,但 firstofficevisit 抛出上面的错误:

{
"patientId":3,
"dateOfBirth":"04/11/1984",
"firstofficevisit":"08-21-1999",
...
}

我的 DTO 上有这个:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "MM/dd/yyyy")
private LocalDate dateOfBirth;

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "MM/dd/yyyy")
private LocalDate firstofficevisit;

但是,除非日期完全按照原样提交,否则就会失败。我确实有一个很好的 Java 实用程序来处理日期转换,我想知道是否可以让我的 DTO 使用它:

public class DateUtil {

private static final Map<String, String> DATE_FORMAT_REGEXPS = new HashMap<String, String>() {{
put("^\\d{8}$", "yyyyMMdd");
put("^\\d{1,2}-\\d{1,2}-\\d{4}$", "dd-MM-yyyy");
put("^\\d{4}-\\d{1,2}-\\d{1,2}$", "yyyy-MM-dd");
put("^\\d{1,2}/\\d{1,2}/\\d{4}$", "MM/dd/yyyy");
put("^\\d{4}/\\d{1,2}/\\d{1,2}$", "yyyy/MM/dd");
put("^\\d{1,2}\\s[a-z]{3}\\s\\d{4}$", "dd MMM yyyy");
put("^\\d{1,2}\\s[a-z]{4,}\\s\\d{4}$", "dd MMMM yyyy");
put("^\\d{12}$", "yyyyMMddHHmm");
put("^\\d{8}\\s\\d{4}$", "yyyyMMdd HHmm");
put("^\\d{1,2}-\\d{1,2}-\\d{4}\\s\\d{1,2}:\\d{2}$", "dd-MM-yyyy HH:mm");
put("^\\d{4}-\\d{1,2}-\\d{1,2}\\s\\d{1,2}:\\d{2}$", "yyyy-MM-dd HH:mm");
put("^\\d{1,2}/\\d{1,2}/\\d{4}\\s\\d{1,2}:\\d{2}$", "MM/dd/yyyy HH:mm");
put("^\\d{4}/\\d{1,2}/\\d{1,2}\\s\\d{1,2}:\\d{2}$", "yyyy/MM/dd HH:mm");
put("^\\d{1,2}\\s[a-z]{3}\\s\\d{4}\\s\\d{1,2}:\\d{2}$", "dd MMM yyyy HH:mm");
put("^\\d{1,2}\\s[a-z]{4,}\\s\\d{4}\\s\\d{1,2}:\\d{2}$", "dd MMMM yyyy HH:mm");
put("^\\d{14}$", "yyyyMMddHHmmss");
put("^\\d{8}\\s\\d{6}$", "yyyyMMdd HHmmss");
put("^\\d{1,2}-\\d{1,2}-\\d{4}\\s\\d{1,2}:\\d{2}:\\d{2}$", "dd-MM-yyyy HH:mm:ss");
put("^\\d{4}-\\d{1,2}-\\d{1,2}\\s\\d{1,2}:\\d{2}:\\d{2}$", "yyyy-MM-dd HH:mm:ss");
put("^\\d{1,2}/\\d{1,2}/\\d{4}\\s\\d{1,2}:\\d{2}:\\d{2}$", "MM/dd/yyyy HH:mm:ss");
put("^\\d{4}/\\d{1,2}/\\d{1,2}\\s\\d{1,2}:\\d{2}:\\d{2}$", "yyyy/MM/dd HH:mm:ss");
put("^\\d{1,2}\\s[a-z]{3}\\s\\d{4}\\s\\d{1,2}:\\d{2}:\\d{2}$", "dd MMM yyyy HH:mm:ss");
put("^\\d{1,2}\\s[a-z]{4,}\\s\\d{4}\\s\\d{1,2}:\\d{2}:\\d{2}$", "dd MMMM yyyy HH:mm:ss");
}};

我的问题是日期以字符串形式出现,尝试验证每个排列的有效性和格式充其量也很笨拙,特别是因为我有许多日期字段需要这样做。

所以我不确定最好的方法 - 是否有可能让 Jackson 对我的 DateUtil.java 更加宽容(以及如何连接它!)或者是否有办法在客户端强制执行此操作,哪里看起来更自然?您可以分享的任何示例都会很有帮助

最佳答案

无法自动解析任何格式的日期。您必须以某种方式在某处列出您想要按特定顺序处理的所有格式。或者如果可能的话,在前端强制执行特定格式。您不必将 json 预处理为文本即可对其进行解析。

据我所知,使用 Java 8 和 Jackson 处理多种日期格式的最简单方法是使用自定义 JsonDeserializer 和多个可选模式。例如

class LocalDateParser extends JsonDeserializer<LocalDate> {

private final DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder()
.appendOptional(DateTimeFormatter.ofPattern("MM-dd-yyyy"))
.appendOptional(DateTimeFormatter.ofPattern("MM/dd/yyyy"))
.toFormatter();

@Override
public LocalDate deserialize(JsonParser jsonparser, DeserializationContext context) throws IOException {
return LocalDate.parse(jsonparser.getText(), dateFormatter);
}
}

并像这样注释您的字段:

@JsonDeserialize(using = LocalDateParser.class)
public LocalDate firstofficevisit;

关于javascript - 将 json 日期转换为 Jackson 的众多日期之一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41499742/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com