使用GSON解析JSON日期转LocalDate时触发DateTimeParseException异常
问题根源与解决方案
你遇到的DateTimeParseException是因为获取startDate字符串时用错了方法!
看你的代码:
JsonPrimitive date = obj.getAsJsonPrimitive("startDate"); String dateString = date.toString(); // 这里就是出错的关键!
GSON的JsonPrimitive.toString()方法会把字符串类型的原始值额外包裹一层双引号,比如原本的"13.05.2018"会变成"\"13.05.2018\""(也就是带引号的字符串)。当你用dd.MM.yyyy格式去解析这个带引号的字符串时,索引2的位置是双引号,完全不符合日期格式规则,自然就抛出异常了。
而你处理endDate的时候用了date.getAsString(),这个方法才是正确获取原始字符串值的方式,不会额外添加引号,所以能正常解析。
修正后的代码
把startDate的获取方式改成和endDate一致,使用getAsString():
private List<LocalDate> getStartEndDate(String message){ List<LocalDate> dates = new ArrayList<>(); JsonObject obj = parseJson(message); // 修正startDate的字符串获取逻辑 JsonPrimitive startDatePrimitive = obj.getAsJsonPrimitive("startDate"); String startDateString = startDatePrimitive.getAsString(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy"); dates.add(LocalDate.parse(startDateString, formatter)); JsonPrimitive endDatePrimitive = obj.getAsJsonPrimitive("endDate"); String endDateString = endDatePrimitive.getAsString(); LocalDate end = LocalDate.parse(endDateString, formatter); dates.add(end); return dates; }
额外小建议
- 可以把
DateTimeFormatter定义成类的静态常量,避免每次调用方法都创建新实例,提升性能:private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy"); - 建议添加空值检查,避免
obj.getAsJsonPrimitive()返回null时出现空指针异常,让代码更健壮。
内容的提问来源于stack exchange,提问作者firas
相关产品推荐
相关产品推荐

