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>
  1. public class CustomJsonDateDeserializer extends JsonDeserializer<Date> {
  2. @Override
  3. public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
  4. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  5. String date = jp.getText();
  6. try {
  7. return format.parse(date);
  8. } catch (ParseException e) {
  9. throw new RuntimeException(e);
  10. }
  11. }
  12. }
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方法上进行注册

  1. @JsonDeserialize(using = CustomJsonDateDeserializer.class)
  2. public void setDate(Date date) {
  3. this.date = date;
  4. }
@JsonDeserialize(using = CustomJsonDateDeserializer.class)
public void setDate(Date date) {
this.date = date;
}


第二种解决办法(使用注解)

在org.springframework.format.annotation包下
  1. import com.fasterxml.jackson.annotation.*;
  2. @JsonIgnoreProperties(ignoreUnknown = true)
  3. public class EmployeeProfile{
  4. private String name;
  5. private Integer age;
  6. @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
  7. private Date creation_date;
  8. }


jackson自定义接受多种日期格式类
  1. /**
  2. * 类说明:自定义jackson日期转换器,因为jackson内置支持转换的日期格式比较少
  3. */
  4. public class CustomJsonDateDeserializer extends JsonDeserializer<Date>{
  5. //添加不同的日期格式
  6. private static  List<String> formats = new ArrayList<String>();
  7. static{
  8. formats.add("yyyy");
  9. formats.add("yyyy-MM");
  10. formats.add("yyyy-MM-dd");
  11. formats.add("yyyy-MM-dd HH:mm");
  12. formats.add("yyyy-MM-dd HH:mm:ss");
  13. formats.add("yyyy/MM");
  14. formats.add("yyyy/MM/dd");
  15. formats.add("yyyy/MM/dd HH:mm");
  16. formats.add("yyyy/MM/dd HH:mm:ss");
  17. }
  18. @Override
  19. public Date deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JsonProcessingException {
  20. String dateStr = jp.getText();
  21. try {
  22. if (dateStr.matches("^\\d{4}$")) {//2017
  23. return parseDate(dateStr, formats.get(0));
  24. } else if (dateStr.matches("^\\d{4}-\\d{1,2}$")) {//2017-09
  25. return parseDate(dateStr, formats.get(1));
  26. } else if (dateStr.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")) {//2017-09-10
  27. return parseDate(dateStr, formats.get(2));
  28. } else if (dateStr.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")) {//2017-09-10 21:15
  29. return parseDate(dateStr, formats.get(3));
  30. } 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
  31. return parseDate(dateStr, formats.get(4));
  32. } else if (dateStr.matches("^\\d{4}/\\d{1,2}$")) {//2017/09
  33. return parseDate(dateStr, formats.get(5));
  34. } else if (dateStr.matches("^\\d{4}/\\d{1,2}/\\d{1,2}$")) {//2017/09/10
  35. return parseDate(dateStr, formats.get(6));
  36. } else if (dateStr.matches("^\\d{4}/\\d{1,2}/\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")) {//2017/09/10 21:15
  37. return parseDate(dateStr, formats.get(7));
  38. } 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
  39. return parseDate(dateStr, formats.get(8));
  40. } else {
  41. throw new BetException("在jackson自定义全局日期转换器,没有相对应的日期格式与传入的日期相匹配!!!");
  42. }
  43. } catch (Exception e) {
  44. e.printStackTrace();
  45. }
  46. return null;
  47. }
  48. /**
  49. * 功能描述:格式化日期
  50. *
  51. * @param dateStr
  52. *            String 字符型日期
  53. * @param format
  54. *            String 格式
  55. * @return Date 日期
  56. */
  57. public  Date parseDate(String dateStr, String format) {
  58. Date date=null;
  59. SimpleDateFormat dateFormat = new SimpleDateFormat(format);
  60. dateFormat.setLenient(false);//指定日期/时间解析为不严格
  61. try {
  62. date = (Date) dateFormat.parse(dateStr);
  63. } catch (ParseException e) {
  64. e.printStackTrace();
  65. } catch (Exception e1) {
  66. e1.printStackTrace();
  67. }
  68. return date;
  69. }
/**
* 类说明:自定义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 属性值为 需要解析的日期类型 对应的解析器或自定义解析器

posted @
2018-05-28 15:14 
jobs-lgy 
阅读(...) 
评论(...) 
编辑 
收藏

jackson处理日期异常的更多相关文章

  1. spring mvc3中JACKSON序列化日期格式的问题 - 墙头草的Java - BlogJava

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  2. mysql0000-00-00日期异常及解决方法

    当mysql的datetime类型的值设置为0000-00-00 00:00:00(或者 0000-00-00)的时候,java的datetime或者timestamp读取到这个值并转换的时候,将抛出 ...

  3. Jackson 格式化日期问题

    Jackson 默认是转成timestamps形式的,如何使用自己需要的类型, 解决办法: 1.在实体字段上使用@JsonFormat注解格式化日期 @JsonFormat(locale=" ...

  4. [心得体会]springmvc在requestbody注解下使用jackson转化日期格式

    使用WebMvcConfigurer的方法将converter注入到项目中 @Configurationpublic class ConverterConfig implements WebMvcCo ...

  5. jackson对日期的处理(序列化与反序列化)

    https://blog.csdn.net/cover1231988/article/details/76021478

  6. Jackson序列化日期类型的属性

    @JsonProperty("BankSettlementDate") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = ...

  7. Springboot Jackson配置根本方案, 日期格式化, 时区设置生效

    当项目集成配置的功能越来越多, 说不准哪个配置就影响到了什么. 比如你启用了EnableMvC, 默认配置文件配置的一些文件就失效了. 虽然约定大于配置,让springboot可以极简化构建, 但不熟 ...

  8. Jackson实现Object对象与Json字符串的互转

    在项目开发过程中,当客户端与服务器响应时,数据交互是必不可少的.然而通过Json实现数据交互成为我们开发中的一部分,进而Jackson为我们的Json转化提供了很好的机制.下面我将利用实例总结如何使用 ...

  9. Java的日期工具类

    package com.tech.jin.util; import java.text.DateFormat; import java.text.ParseException; import java ...

随机推荐

  1. 老大难的 Java ClassLoader,到了该彻底理解它的时候了

    ClassLoader 是 Java 届最为神秘的技术之一,无数人被它伤透了脑筋,摸不清门道究竟在哪里.网上的文章也是一篇又一篇,经过本人的亲自鉴定,绝大部分内容都是在误导别人.本文我带读者彻底吃透 ...

  2. Java进阶学习(1)之类与对象(上)

    package com.study; //自动售卖机 public class vmachine { private int price = 80; private int balance; priv ...

  3. [Qt 踩坑] 设置背景就卡退 报错 异常结束或者crashed 0xFFFFFFFF

    #开始 我现在是带着崩溃得心情写博客的 这个估计是我遇到的最混蛋的bug 我试图用Qt写个小程序 然后给窗口添加一个背景 就像这样 先不管我那个路径的问题 只要写了那个代码,就一定出错 删除了一点事情 ...

  4. if语句的汇编表示

    转自:https://blog.csdn.net/u011608357/article/details/22586137 demo: C语言: int max(int x,int y) { if (x ...

  5. 浅谈hover用法

    在前端页面制作中,我们时常要用到移动显示.隐藏的动态效果,我们一般采用js来实现此效果.不过在大部分情况下,我们也可以使用hover来实现此动态效果. 在此,我谈一谈我对hover的用法,请看以下代码 ...

  6. iOS 开发之使用链式编程思想实现简单的计算器

    链式编程思想是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好.例如 a(1).b(2).c(3). 链式编程思想最为关键的是,方法的返回值是block,block必须返回对 ...

  7. 本地缓存Caffeine

    Caffeine 说起Guava Cache,很多人都不会陌生,它是Google Guava工具包中的一个非常方便易用的本地化缓存实现,基于LRU算法实现,支持多种缓存过期策略.由于Guava的大量使 ...

  8. js下false情况

    //为false的情况 false null NaN undefined "" 0

  9. C语言:利用指针解决:统计一个长度为2的字符串在另外一个字符串中出现的次数。

    //统计一个长度为2的字符串在另外一个字符串中出现的次数. #include <conio.h> #include <stdio.h> #include <string. ...

  10. BFS(广度优先搜索遍历保存全局状态,华容道翻版做法)--08--DFS--蓝桥杯青蛙跳杯子

    题目描述 X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色. X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去. 如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙 ...