jackson处理日期异常
2024-10-21 10:19:14
原
jackson处理日期异常
2018年01月09日 10:50:19
阅读数:70
1.异常信息
2.原因
默认情况下,fasterxml json只支持几种format,但是肯定不支持"yyyy-MM-dd HH:mm:ss"格式,所以就要自己指定date format了。
3.解决办法
a.创建一个类继承JsonDeserializer<Date>
- public class CustomJsonDateDeserializer extends JsonDeserializer<Date> {
- @Override
- public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
- SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- String date = jp.getText();
- try {
- return format.parse(date);
- } catch (ParseException e) {
- throw new RuntimeException(e);
- }
- }
- }
public class CustomJsonDateDeserializer extends JsonDeserializer<Date> {
@Override
public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = jp.getText();
try {
return format.parse(date);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
b.在实体类属性的set方法上进行注册
- @JsonDeserialize(using = CustomJsonDateDeserializer.class)
- public void setDate(Date date) {
- this.date = date;
- }
@JsonDeserialize(using = CustomJsonDateDeserializer.class)
public void setDate(Date date) {
this.date = date;
}
第二种解决办法(使用注解)
在org.springframework.format.annotation包下
- import com.fasterxml.jackson.annotation.*;
- @JsonIgnoreProperties(ignoreUnknown = true)
- public class EmployeeProfile{
- private String name;
- private Integer age;
- @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
- private Date creation_date;
- }
jackson自定义接受多种日期格式类
- /**
- * 类说明:自定义jackson日期转换器,因为jackson内置支持转换的日期格式比较少
- */
- public class CustomJsonDateDeserializer extends JsonDeserializer<Date>{
- //添加不同的日期格式
- private static List<String> formats = new ArrayList<String>();
- static{
- formats.add("yyyy");
- formats.add("yyyy-MM");
- formats.add("yyyy-MM-dd");
- formats.add("yyyy-MM-dd HH:mm");
- formats.add("yyyy-MM-dd HH:mm:ss");
- formats.add("yyyy/MM");
- formats.add("yyyy/MM/dd");
- formats.add("yyyy/MM/dd HH:mm");
- formats.add("yyyy/MM/dd HH:mm:ss");
- }
- @Override
- public Date deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JsonProcessingException {
- String dateStr = jp.getText();
- try {
- if (dateStr.matches("^\\d{4}$")) {//2017
- return parseDate(dateStr, formats.get(0));
- } else if (dateStr.matches("^\\d{4}-\\d{1,2}$")) {//2017-09
- return parseDate(dateStr, formats.get(1));
- } else if (dateStr.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")) {//2017-09-10
- return parseDate(dateStr, formats.get(2));
- } else if (dateStr.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")) {//2017-09-10 21:15
- return parseDate(dateStr, formats.get(3));
- } else if (dateStr.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")) {//2017-09-10 21:15:30
- return parseDate(dateStr, formats.get(4));
- } else if (dateStr.matches("^\\d{4}/\\d{1,2}$")) {//2017/09
- return parseDate(dateStr, formats.get(5));
- } else if (dateStr.matches("^\\d{4}/\\d{1,2}/\\d{1,2}$")) {//2017/09/10
- return parseDate(dateStr, formats.get(6));
- } else if (dateStr.matches("^\\d{4}/\\d{1,2}/\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")) {//2017/09/10 21:15
- return parseDate(dateStr, formats.get(7));
- } else if (dateStr.matches("^\\d{4}/\\d{1,2}/\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")) {//2017/09/10 21:15:30
- return parseDate(dateStr, formats.get(8));
- } else {
- throw new BetException("在jackson自定义全局日期转换器,没有相对应的日期格式与传入的日期相匹配!!!");
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- /**
- * 功能描述:格式化日期
- *
- * @param dateStr
- * String 字符型日期
- * @param format
- * String 格式
- * @return Date 日期
- */
- public Date parseDate(String dateStr, String format) {
- Date date=null;
- SimpleDateFormat dateFormat = new SimpleDateFormat(format);
- dateFormat.setLenient(false);//指定日期/时间解析为不严格
- try {
- date = (Date) dateFormat.parse(dateStr);
- } catch (ParseException e) {
- e.printStackTrace();
- } catch (Exception e1) {
- e1.printStackTrace();
- }
- return date;
- }
/**
* 类说明:自定义jackson日期转换器,因为jackson内置支持转换的日期格式比较少
*/
public class CustomJsonDateDeserializer extends JsonDeserializer<Date>{
//添加不同的日期格式
private static List<String> formats = new ArrayList<String>();
static{
formats.add("yyyy");
formats.add("yyyy-MM");
formats.add("yyyy-MM-dd");
formats.add("yyyy-MM-dd HH:mm");
formats.add("yyyy-MM-dd HH:mm:ss");
formats.add("yyyy/MM");
formats.add("yyyy/MM/dd");
formats.add("yyyy/MM/dd HH:mm");
formats.add("yyyy/MM/dd HH:mm:ss");
}@Override
public Date deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JsonProcessingException {
String dateStr = jp.getText();
try {
if (dateStr.matches("^\\d{4}$")) {//2017
return parseDate(dateStr, formats.get(0));
} else if (dateStr.matches("^\\d{4}-\\d{1,2}$")) {//2017-09
return parseDate(dateStr, formats.get(1));
} else if (dateStr.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")) {//2017-09-10
return parseDate(dateStr, formats.get(2));
} else if (dateStr.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")) {//2017-09-10 21:15
return parseDate(dateStr, formats.get(3));
} else if (dateStr.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")) {//2017-09-10 21:15:30
return parseDate(dateStr, formats.get(4));
} else if (dateStr.matches("^\\d{4}/\\d{1,2}$")) {//2017/09
return parseDate(dateStr, formats.get(5));
} else if (dateStr.matches("^\\d{4}/\\d{1,2}/\\d{1,2}$")) {//2017/09/10
return parseDate(dateStr, formats.get(6));
} else if (dateStr.matches("^\\d{4}/\\d{1,2}/\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")) {//2017/09/10 21:15
return parseDate(dateStr, formats.get(7));
} else if (dateStr.matches("^\\d{4}/\\d{1,2}/\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")) {//2017/09/10 21:15:30
return parseDate(dateStr, formats.get(8));
} else {
throw new BetException("在jackson自定义全局日期转换器,没有相对应的日期格式与传入的日期相匹配!!!");
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
} /**
* 功能描述:格式化日期
*
* @param dateStr
* String 字符型日期
* @param format
* String 格式
* @return Date 日期
*/
public Date parseDate(String dateStr, String format) {
Date date=null;
SimpleDateFormat dateFormat = new SimpleDateFormat(format);
dateFormat.setLenient(false);//指定日期/时间解析为不严格
try {
date = (Date) dateFormat.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
} catch (Exception e1) {
e1.printStackTrace();
}
return date;
}</pre></div>
</article>
<div class="article-bar-bottom">
<div class="article-copyright">
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mzy755423868/article/details/79010313 </div>
<div class="tags-box">
<span class="label">个人分类:</span>
<a class="tag-link" href="https://blog.csdn.net/mzy755423868/article/category/7390132" target="_blank">其他问题解决 </a>
</div>
</div>
<!-- !empty($pre_next_article[0]) -->
</div>
JavaBean中的属性配置注解
@JsonDeserialize(using = XXXDeserializer.class)
@JsonSerialize(using = XXXSerializer.class)
using 属性值为 需要解析的日期类型 对应的解析器或自定义解析器
最新文章
- servlet学习笔记_2
- JavaScript模块化
- GitBook制作电子书详细教程(命令行版)
- mac上抓iphone数据包
- Hadoop 2.4.1 登录认证配置小结
- VS 2013 中如何自定义代码片段
- Android开发之Android Context,上下文(Activity Context, Application Context)
- A Tour of Go Interfaces are satisfied implicitly
- java设计模式和设计原则
- uva 10014 Simple calculations
- mysql 打开慢查询日志
- Android 开发环境的搭建(新环境)
- leetcode网学习笔记(1)
- 基本的java加密算法MD5等等
- MySQL数据库一些常用命令
- 取n到m行
- CF597C Subsequences 树状数组 + 动态规划
- 20190121-n个人围成一圈,凡报到3的人退出圈子,最后留下的是原来第几号的那位
- ant-design 设置 DatePicker 默认值
- Node.Js and Mongoose