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

目录
  • 问题背景
  • 问题复现
  • 为什么FastJson会出问题
  • 解决方案(3种)
  • 反思

问题背景

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

{"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时间格式化的资料请关注我们其它相关文章!

(0)

相关推荐

  • java安全fastjson1.2.24反序列化TemplatesImpl分析

    目录 1. fastjson序列化 2. fastjson反序列化 3. fastjson反序列化漏洞原理 4. fastjson1.2.24漏洞复现 5. fastjson1.2.24漏洞分析 前言 漏洞环境: fastjson1.2.24 jdk1.7.80 新建一个maven项目在pom.xml文件中引入fastjson的依赖: <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjs

  • FastJson踩坑:@JsonField在反序列化时失效的解决

    问题描述 一个对象(某个字段为枚举类型,为了不采用默认的序列化过程,用@JSONField指定了序列化器和反序列器,过程见旧博文),将其放到JSONArray中再序列化JSONArray对象,用得到的JSON字符串再反序列化时,发现能够正常反序列化出JSONArray,而对JSONArray中的某个元素再反序列化成类对象时,出错. 示例 同样用旧博文的示例做个简单测试. 基本对象类Article. public class Article { private String title; priv

  • Fastjson反序列化随机性失败示例详解

    目录 前言 问题代码 StewardTipItem StewardTipCategory StewardTip JSON字符串 FastJSONTest 堆栈信息 问题排查 JavaBeanInfo:285行 JavaBeanInfo:492行 JavaBeanDeserializer:49行 JavaBeanDeserializer:838行 DefaultFieldDeserializer:53行 DefaultFieldDeserializer:34行 MapDeserializer:22

  • 泛型的类型擦除后fastjson反序列化时如何还原详解

    目录 铺垫 错误写法1 错误写法2 正确写法 TypeReference 验证 扩展 铺垫 在前面的文章中,我们讲过Java中泛型的类型擦除,不过有小伙伴在后台留言提出了一个问题,带有泛型的实体的反序列化过程是如何实现的,今天我们就来看看这个问题. 我们选择fastjson来进行反序列化的测试,在测试前先定义一个实体类: @Data public class Foo<T> { private String val; private T obj; } 如果大家对泛型的类型擦除比较熟悉的话,就会知

  • fastjson序列化时间自定义格式示例详解

    目录 Java8 的日期相关 API 首先建一个项目添加依赖 配置类中注入 Spriing 容器 写个接口做下测试 Java8 的日期相关 API Java8 的日期相关 API用起来是真香,但免不了遇到在用旧版 1.0 API 的情况.这不,跟另一个部门做对接,人家说你发过来的时间怎么带个 T,我这边没法解析...我回头就是一句xxx,情绪发泄完该做的事咱也得做不是,下面就看看怎么处理这个问题. 首先建一个项目添加依赖 <dependencies> <dependency> &l

  • SpringBoot Redis配置Fastjson进行序列化和反序列化实现

    FastJson是阿里开源的一个高性能的JSON框架,FastJson数据处理速度快,无论序列化(把JavaBean对象转化成Json格式的字符串)和反序列化(把JSON格式的字符串转化为Java Bean对象),都是当之无愧的fast:功能强大(支持普通JDK类,包括javaBean, Collection, Date 或者enum):零依赖(没有依赖其他的任何类库). 1.写一个自定义序列化类 /** * 自定义序列化类 * @param <T> */ public class FastJ

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

    目录 问题背景 问题复现 为什么FastJson会出问题 解决方案(3种) 反思 问题背景 某一天,我们系统服务的依赖方找到我们,问我们为什么时间类型的字段会有这种数据存在?导致他们解析的时候报错. {"sloganEndtime": "20211-03-10 11:30:00"} // 字段类型 private Date sloganEndtime; 于是我们开始进行排查,最后发现数据源头来源于一个导入表格的功能,商家运营人员在导入数据的时候写错了,所以导致了非常

  • python中日期和时间格式化输出的方法小结

    本文实例总结了python中日期和时间格式化输出的方法.分享给大家供大家参考.具体分析如下: python格式化日期时间的函数为datetime.datetime.strftime():由字符串转为日期型的函数为:datetime.datetime.strptime(),两个函数都涉及日期时间的格式化字符串,这里提供详细的代码详细演示了每一个参数的使用方法及范例. 下面是格式化日期和时间时可用的替换符号 %a 输出当前是星期几的英文简写 >>> import datetime >&

  • springmvc fastjson 反序列化时间格式化方法(推荐)

    第一种情况是从后台拿到数据,进行反序列化,反序列化格式时间:试了一下很多网上的方法,最后发现还是在实体类上面的日期字段加上如下注解,可以完成格式化操作,否则默认就都是时间戳的格式: @JSONField (format="yyyy-MM-dd HH:mm:ss")  public Date birthday; @JSONField (format="yyyy-MM-dd HH:mm:ss")  public Date birthday; 第二种情况是:respons

  • vue 做移动端微信公众号采坑经验记录

    自己用vue做微信公众号项目有一段时间了,遇到各种奇葩的问题,下面细数那些坑: 第一坑:微信分享导致安卓手机无法调起相册和无法调起微信充值 解决方案: setTimeout(_ => { wx.config(sdkConfig) }, 500) 需要将微信分享延迟500毫秒,这样就解决了安卓手机无法调用相册和微信充值的问题,如果用了微信分享需要加个延迟. 第二坑:部分手机第三方输入法会将页面网上挤的问题 解决方案: // 特定需求页面,比如评论页面,输入框在顶部之类的 const interva

  • Java多线程基本概念以及避坑指南

    目录 前言 1. 多线程基本概念 1.1 轻量级进程 1.2 JMM 1.3 Java中常见的线程同步方式 2. 避坑指南 2.1. 线程池打爆机器 2.2. 锁要关闭 2.3. wait要包两层 2.4. 不要覆盖锁对象 2.5. 处理循环中的异常 2.6. HashMap正确用法 2.7. 线程安全的保护范围 2.8. volatile作用有限 2.9. 日期处理要小心 2.10. 不要在构造函数中启动线程 End 前言 多核的机器,现在已经非常常见了.即使是一块手机,也都配备了强劲的多核处

  • gtoken替换jwt实现sso登录的排雷避坑

    目录 前言 gtoken gtoken替换jwt解决的问题 兼容JWT gtoken实现原理 踩坑之旅 1 gtoken版本 2 gtoken存储问题 3 不能跨环境使用token 4 测试账号不规范问题 总结 前言 前段时间整理的文章:gtoken替换jwt实现sso登录 | 带你读源码 收到了大家积极的反馈,gtoken替换jwt实现sso登录的开发过程是比较稳健的,但是在我们测试联调的过程中暴露出了很多问题. 如果大家也想使用gtoken替换jwt实现sso登录,那么这篇文章可以减少很多大

  • vue时间格式化实例代码

    整理文档,搜刮出一个vue时间格式化实例代码,稍微整理精简一下做下分享. export function formatDate(date, fmt) { if (/(y+)/.test(fmt)) { fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)); } let o = { 'M+': date.getMonth() + 1, 'd+': date.getDate(), 'h

  • 手动挡汽车如何开省油的经验分享

    怎样开车最省油 一.新车磨合 新车在最初的3000公里行驶里程之内一定要磨合.新车磨合要注意时速控制在每小时80公里以内:尽量减少急加速.急减速. 二.合理保养汽车--定期保养 要知道车况良好的汽车可省油15%到20%. 1.空气滤清器.汽油滤清器.机油滤清器:每行驶5000公里以上配件都需要更换,因为空滤堵塞会引起气量减少,导致汽油燃烧不充分,降低燃油效率,而汽油滤清器的阻塞也会使发动机工作异常. 2.机油:加机油需要适量,注意机油标尺所标示的刻度.机油太多将曲轴淹没,增大阻力:机油太少则无法

  • Android 仿微信聊天时间格式化显示功能

    本文给大家分享android仿微信聊天时间格式化显示功能. 在同一年的显示规则: 如果是当天显示格式为 HH:mm 例:14:45 如果是昨天,显示格式为 昨天 HH:mm 例:昨天 13:12 如果是在同一周 显示格式为 周一 HH:mm 例:周一14:05 如果不是同一周则显示格式为 M月d日 早上或者其它 HH:mm 例: 2月5日 早上10:10 不在同一年的显示规则: 显示格式为 yyyy年M月d日 晚上或者其它 HH:mm 例:2016年2月5日 晚上18:05 代码中如果有误,请留

  • MyBatis一级缓存避坑完全指南

    一级缓存概念 当我们使用Mybatis进行数据库的操作时候,会创建一个SqlSession来进行一次数据库的会话,会话结束则关闭SqlSession对象.那么一个SqlSession的生命周期即对应于Mybatis的一次会话.在Mybatis的一次会话中,我们很有可能多次查询完全相同的sql语句,如果不采取措施的话,每一次查询都查询一次数据库.而一次会话时间一般都是极短的,相同Sql的查询结果极有可能完全相同.由于查询数据库代价是比较大的,这会导致系统的资源浪费. 为了解决这个问题,Mybati

随机推荐