fastjson对于yyyy-MM-dd HH:mm格式的反序列化问题
问题:最近在工作中遇到这么一个问题:有个实体类,它有个date类型的属性,当在这个属性加上fastjson的注解@JSONField (format=”yyyy-MM-dd HH:mm”)将秒去掉后,对象转换成json字符串,再用这个字符串反过来转换成对象的时候去报错了。如图所示:
查看源码后得知是fastjson在处理这个日期格式时并没有考虑到这个问题。好在fastjson可以扩展,我们可以通过继承DateFormatDeserializer去实现我们自己的反序列化器来解析这个格式。
记录一下解决办法以便今后查询,当然,这不一定就是正确的解决办法,如果有更好的解决办法欢迎给我留言。
解决办法:我们要自己去实现自己的Deserializer
这里我取了个巧,参考了fastjson的util包中TypeUtils类的castToDate方法了。。。。
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.parser.DefaultJSONParser;
import com.alibaba.fastjson.parser.deserializer.DateFormatDeserializer;
import java.lang.reflect.Type;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
* Created by gray on 2017/3/12.
*/
public class MyDateFormatDeserializer extends DateFormatDeserializer {
@Override
protected <T> T cast(DefaultJSONParser parser, Type clazz, Object fieldName, Object value) {
if(value == null) {
return null;
} else if(value instanceof Calendar) {
return (T) ((Calendar)value).getTime();
} else if(value instanceof Date) {
return (T) value;
} else {
long longValue = -1L;
if(value instanceof Number) {
longValue = ((Number)value).longValue();
return (T) new Date(longValue);
} else {
if(value instanceof String) {
String strVal = (String)value;
if(strVal.indexOf(45) != -1) {
String format;
if(strVal.length() == 10) {
format = "yyyy-MM-dd";
} else if(strVal.length() == "yyyy-MM-dd HH:mm".length()) {
format = "yyyy-MM-dd HH:mm";
} else if(strVal.length() == "yyyy-MM-dd HH:mm:ss".length()) {
format = "yyyy-MM-dd HH:mm:ss";
} else {
format = "yyyy-MM-dd HH:mm:ss.SSS";
}
SimpleDateFormat dateFormat = new SimpleDateFormat(format);
try {
return (T) dateFormat.parse(strVal);
} catch (ParseException var7) {
throw new JSONException("can not cast to Date, value : " + strVal);
}
}
if(strVal.length() == 0) {
return null;
}
longValue = Long.parseLong(strVal);
}
if(longValue < 0L) {
throw new JSONException("can not cast to Date, value : " + value);
} else {
return (T) new Date(longValue);
}
}
}
}
}
测试:在我们要使用的地方这么写,如下代码:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.Feature;
import com.alibaba.fastjson.parser.ParserConfig;
import java.util.Date;
/**
* Created by gray on 2017/3/12.
*/
public class Test {
static ParserConfig config = new ParserConfig();
public static void main(String args[]) {
String json = "{oneDate:'2017-03-14 20:25',twoDate:'2017-03-14 21:30:12',text:'test'}";
config.putDeserializer(Date.class, new MyDateFormatDeserializer()); // 我们自己实现的Deserializer
TestBean bean = JSON.parseObject(json,TestBean.class, config, JSON.DEFAULT_PARSER_FEATURE, new Feature[0]);
System.out.print(bean.toString());
}
}
parseObject这个方法平时我们用得多的就是String和class两个参数,其实它后面会默认调用多参的方法,放入默认的配置而已。这样写然后运行结果就正确了,MyDateFormatDeserializer里面该处理的格式都处理清楚就不会影响别的date格式了(onedate和twodate格式互不影响,如果你的MyDateFormatDeserializer只处理了”yyyy-MM-dd HH:mm”这一种格式会导致twodate的精度丢失)。运行结果如图所示:
最后附上TestBean
import java.util.Date;
/**
* Created by gray on 2017/3/12.
*/
public class TestBean {
private Date oneDate;
private Date twoDate;
private String text;
public Date getOneDate() {
return oneDate;
}
public void setOneDate(Date oneDate) {
this.oneDate = oneDate;
}
public Date getTwoDate() {
return twoDate;
}
public void setTwoDate(Date twoDate) {
this.twoDate = twoDate;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
@Override
public String toString() {
return "TestBean{" +
"oneDate=" + oneDate +
", twoDate=" + twoDate +
", text='" + text + '\'' +
'}';
}
}
fastjson对于yyyy-MM-dd HH:mm格式的反序列化问题的更多相关文章
- 小程序日期格式(yyyy-MM-dd HH:mm:ss)转(yyyy/MM/dd HH:mm:ss)
let newDate = (date).replace(/-/g, '/'); var date = new Date(newDate).getTime();
- java 日期格式转换EEE MMM dd HH:mm:ss z yyyy
SimpleDateFormat parserSDF = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzzz yyyy", Locale. ...
- js 时间YYYY-MM-DD转换为YYYY/MM/DD 自定义函数格式
<script type="text/javascript"> window.onload = function () { va ...
- SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
java日期格式大全 format SimpleDateFormat(转) SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH ...
- javascript:针对yyyy-MM-dd hh:mm:ss格式的毫秒转换.
javascript:针对yyyy-MM-dd hh:mm:ss格式的毫秒转换. 时间 2015-11-07 22:18:39 HideHai's blog 原文 http://www.hideh ...
- 火狐低版本中显示时间格式为:yyyy-MM-dd hh:mm:ss,出现NaN
在低版本的火狐(43以下)和IE8中,显示时间格式为:yyyy-MM-dd hh:mm:ss,会出现NaN:原因是只支持yyyy/MM/dd hh:mm:ss; 所以在new Date('2018-0 ...
- js转换时间戳-转换成 yyyy-MM-dd HH:mm:ss
比如:转换成 yyyy-MM-dd HH:mm:ss //时间戳转换方法 date:时间戳数字 function formatDate(date) { var date = new Date(date ...
- vue-cli 利用moment.js转化时间格式为YYYY年MM月DD日,或者是YYYY-MM-DD HH:MM:SS 等格式
1.在mian.js引入moment import moment from 'moment' Vue.prototype.$moment = 'moment' 2. 在main.js 设置全局过滤器 ...
- dd/MMM/yyyy:hh:mm:ss +0800日期格式的转化
private static void myHandler() throws ParseException { String dtime1 = "23/Apr/2019:04:08:00 + ...
- JAVA 时间"dd/MMM/yyyy:HH:mm:ss Z", Locale.US
工作遇到时间格式转换问题, 就是在日志分析时, 需要将格式“15/Oct/2009:14:00:00 +0800”转为格式“2009-10-15 14:00:00”, 找了好久没有找到合适的,终于在友 ...
随机推荐
- PC端视频播放器
视频播放器:Potplayer 它是一款纯净的.无广告.极速
- Django信号机制相关解释与示例
Django 信号# django自带一套信号机制来帮助我们在框架的不同位置之间传递信息.也就是说,当某一事件发生时,信号系统可以允许一个或多个发送者(senders)将通知或信号(signals)发 ...
- OpenCV-3.4.3图像通道处理
图像通道处理 图像读取和处理都是按BGR通道顺序进行的 #include <iostream> #include <opencv2/opencv.hpp> #include & ...
- 03-MySQL安装与配置
一.安装MySQL 1.我的是centos8,因此命令为: sudo yum install mysql-server 2.安装完成后查看是否启动 ps aux|grep mysql 3.启动mysq ...
- CH-0304 IncDec Sequence
0304 IncDec Sequence 0x00「基本算法」例题 描述 给定一个长度为 n(n≤10^5 ) 的数列 {a_1,a_2,…,a_n},每次可以选择一个区间 [l,r],使下标在这个区 ...
- Maven 教程之 pom.xml 详解
作者:dunwu https://github.com/dunwu/blog 推荐阅读(点击即可跳转阅读) 1. SpringBoot内容聚合 2. 面试题内容聚合 3. 设计模式内容聚合 4. My ...
- Flask 教程 第七章:错误处理
本文翻译自The Flask Mega-Tutorial Part VII: Error Handling 这是Flask Mega-Tutorial系列的第七部分,我将告诉你如何在Flask应用中进 ...
- SSH框架之Hibernate第三篇
1.1 多表关系分析和创建. 1.1.1 表关系分析和创建 表数据和表数据之间可以存在的关系? 一对多的关系 客户和联系人 建立关系原则: 在多的一方创建一个字段,这个字段作为外键指向一的一方的主键 ...
- SSM框架之Spring(4)AOP
Spring(4)AOP 1.AOP概述 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种 ...
- Linux-3.14.12内存管理笔记【伙伴管理算法(3)】
前面分析了伙伴管理算法的初始化,在切入分析代码实现之前,例行先分析一下其实现原理. 伙伴管理算法(也称之为Buddy算法),该算法将所有空闲的页面分组划分为MAX_ORDER个页面块链表进行管理,其中 ...