zoukankan      html  css  js  c++  java
  • jackson处理日期异常

    jackson处理日期异常

    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.         }  
    b.在实体类属性的set方法上进行注册
    1. @JsonDeserialize(using = CustomJsonDateDeserializer.class)  
    2.      public void setDate(Date date) {  
    3.           this.date = date;  
    4.      }  

    第二种解决办法(使用注解)
    在org.springframework.format.annotation包下
    1. import com.fasterxml.jackson.annotation.*;  
    2. @JsonIgnoreProperties(ignoreUnknown = true)  
    3.   
    4. public class EmployeeProfile{  
    5.   
    6. private String name;  
    7. private Integer age;  
    8.   
    9. @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" 
    10.   
    11. private Date creation_date;  
    12. }  




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

  • 相关阅读:
    个人案例分析
    软工结对作业
    交点问题
    C语言复习
    【软件工程】提问回顾与个人总结
    【技术博客】Arxiv的新Paper获取和机翻
    【技术博客】动态面包屑导航
    对对碰 -- 软工结对编程博客
    交点计数 -- 软工个人项目作业
    面向对象的程序设计-模块四课程总结
  • 原文地址:https://www.cnblogs.com/jobs-lgy/p/9100312.html
Copyright © 2011-2022 走看看