FastJson时间格式化问题避坑经验分享

 更新时间:2022年08月22日 09:49:40   作者:树洞君  
这篇文章主要为大家介绍了FastJson时间格式化问题避坑经验分享,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

问题背景

某一天,我们系统服务的依赖方找到我们,问我们为什么时间类型的字段会有这种数据存在?导致他们解析的时候报错。

{"sloganEndtime": "20211-03-10 11:30:00"}
// 字段类型
private Date sloganEndtime;

于是我们开始进行排查,最后发现数据源头来源于一个导入表格的功能,商家运营人员在导入数据的时候写错了,所以导致了非常离谱的问题。

问题复现

利用原生JDK来转换时间 代码截图如下:会发现不会出现异常

我们换FastJson来尝试下,代码如下:发现会报错!

SkuMainBean mainBean = JSON.parseObject("{\"sloganEndTime\":\"20211-03-10
11:30:00\"}", SkuMainBean.class);
System.out.println(mainBean);
# 异常信息
Exception in thread "main" com.alibaba.fastjson.JSONException: For input
string: "20211-03-10 11:30:00"
at
com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONPars
er.java:627)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:361)

为什么FastJson会出问题

通过跟代码,我们发现FastJson有其自己的默认时间格式:

// com.alibaba.fastjson.JSON#DEFFAULT_DATE_FORMAT
public static String DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

但是其使用判断逻辑是预先校验了FORMAT与入参的长度:

if (strVal.length() == parser.getDateFomartPattern().length()) {
DateFormat dateFormat = parser.getDateFormat();
try {
return (T) dateFormat.parse(strVal);
} catch (ParseException e) {
// skip
}
}
// ....................................
return (T) new java.util.Date(longVal);

解决方案(3种)

1、主动增加格式化注解,尤其是需要转换未知的入参时,需要提前确定

@JSONField(format="yyyy-MM-dd HH:mm:ss")
private Date sloganEndtime;

2、利用时间戳(Long)替换Date类型

3、自己的系统在进行数据传输时,保证数据的合理性,增加相关校验

反思

  • 为什么FastJson(1.2.36版本)在使用日期格式化的时候要预先校验长度?

PS:为什么不检测无注解直接转换失败?

  • 为什么其他系统在进行JSON转换的时候不给字段主动添加格式化注解?
  • 没有绝对的答案,因为使用习惯和代码惯性的原因,我们经常会忽略一些已经习以为常的东西,只有做到更加的严谨和周全,才能尽量减少出错的可能性。

以上就是FastJson时间格式化问题避坑经验分享的详细内容,更多关于FastJson时间格式化的资料请关注脚本之家其它相关文章!

相关文章

  • 详解使用Maven开发Web应用详细步骤

    详解使用Maven开发Web应用详细步骤

    这篇文章主要介绍了详解使用Maven开发Web应用详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • 在js与java中判断json数据中是否含有某字段的案例

    在js与java中判断json数据中是否含有某字段的案例

    这篇文章主要介绍了在js与java中判断json数据中是否含有某字段的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • java实现客房管理系统

    java实现客房管理系统

    这篇文章主要为大家详细介绍了java实现客房管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • Idea2023配置JavaWeb项目(最新)

    Idea2023配置JavaWeb项目(最新)

    本文将介绍如何配置JavaWeb项目,以在Idea中实现开发环境,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • 详解spring boot中使用JdbcTemplate

    详解spring boot中使用JdbcTemplate

    JdbcTemplate 是在JDBC API基础上提供了更抽象的封装,并提供了基于方法注解的事务管理能力。 通过使用SpringBoot自动配置功能并代替我们自动配置beans,下面给大家介绍spring boot中使用JdbcTemplate相关知识,一起看看吧
    2017-04-04
  • 如何使用Java生成具有安全哈希的QR码

    如何使用Java生成具有安全哈希的QR码

    这篇文章主要介绍了如何使用Java生成具有安全哈希的QR码,这是关于如何在Java中使用salt生成QR代码和安全散列字符串的分步教程。,需要的朋友可以参考下
    2019-06-06
  • 使用itextpdf操作pdf的实例讲解

    使用itextpdf操作pdf的实例讲解

    下面小编就为大家分享一篇使用itextpdf操作pdf的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • Java图形界面之JFrame,JLabel,JButton详解

    Java图形界面之JFrame,JLabel,JButton详解

    这篇文章主要介绍了Java图形界面之JFrame、JLabel、JButton详解,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • Spring中的异步方法@Async失效的原因详解

    Spring中的异步方法@Async失效的原因详解

    这篇文章主要介绍了Spring中的异步方法@Async失效的原因详解,@Async属于异步注解,@Async放在方法上标识该方法为异步方法,异步是指进程不需要一直等待下去,而是继续执行下面的操作,不管其他进程的状态,需要的朋友可以参考下
    2024-01-01
  • Java SpringMVC 异常处理SimpleMappingExceptionResolver类详解

    Java SpringMVC 异常处理SimpleMappingExceptionResolver类详解

    这篇文章主要介绍了SpringMVC 异常处理SimpleMappingExceptionResolver类详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09

最新评论