当前位置: 首页 > news >正文

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;

  1. 利用时间戳(Long)替换Date类型
  2. 自己的系统在进行数据传输时,保证数据的合理性,增加相关校验

反思

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

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

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

 

相关文章:

  • 新160个CrackMe分析-第1组:1-10(下)
  • 一文聊透数字化转型,获得企业未来生存的入场券--童亚斋
  • 我实践:搭建轻量git服务器的两个方案
  • Oracle 清理归档日志
  • [1]-基于图搜索的路径规划基础
  • 工业相机飞拍模式介绍及相机曝光值计算
  • spring cloud 使用oauth2 问题收集
  • vscode-pretter 插件支持 styled-components 格式化问题
  • 搭建微服务项目框架环境
  • 与MySQL的纠缠(卸载与安装)
  • nodejs+vue+elementui影城选座管理系统python518
  • 机器学习笔记之支持向量机(一)模型构建思路
  • python-(4-3)数据类型的应用(元组、集合)
  • Hbase基本概念
  • cmake是什么,为什么现在都用cmake,cmake编译原理和跨平台示例
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 345-反转字符串中的元音字母
  • cookie和session
  • CSS实用技巧干货
  • ES6 学习笔记(一)let,const和解构赋值
  • FineReport中如何实现自动滚屏效果
  • IOS评论框不贴底(ios12新bug)
  • k8s如何管理Pod
  • MySQL QA
  • opencv python Meanshift 和 Camshift
  • orm2 中文文档 3.1 模型属性
  • oschina
  • Python_网络编程
  • React-生命周期杂记
  • spark本地环境的搭建到运行第一个spark程序
  • swift基础之_对象 实例方法 对象方法。
  • vue--为什么data属性必须是一个函数
  • 初识MongoDB分片
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 力扣(LeetCode)22
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 深入浅出webpack学习(1)--核心概念
  • 思维导图—你不知道的JavaScript中卷
  • FaaS 的简单实践
  • Semaphore
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​批处理文件中的errorlevel用法
  • !$boo在php中什么意思,php前戏
  • #传输# #传输数据判断#
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (6)添加vue-cookie
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (第27天)Oracle 数据泵转换分区表
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)memcache、redis缓存
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET Core 项目指定SDK版本
  • .NET Reactor简单使用教程