json和bean互转中时间格式的显示和处理(解决总是显示系统当前时间后, 时间为空的时候异常处理) ...

我在处理json和java的相互转换中出现这样的错误:

net.sf.json.JSONException: Error while setting property=date type class java.lang.String

出错的具体情况如下:

在Java-->Json时,日期为空,我写了一个JsonDateProcessor,作为处理Date类型数据的处理器

 

 

Java代码   收藏代码
  1. import java.text.DateFormat;  
  2. import java.text.SimpleDateFormat;  
  3. import java.util.Date;  
  4.   
  5. import net.sf.json.JsonConfig;  
  6. import net.sf.json.processors.JsonValueProcessor;  
  7.   
  8. public class JsonDateProcessor implements JsonValueProcessor {  
  9.     public static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd";  
  10.     private DateFormat dateFormat;  
  11.   
  12.     public JsonDateProcessor() {  
  13.         dateFormat = new SimpleDateFormat(DEFAULT_DATE_PATTERN);  
  14.     }  
  15.   
  16.     /** 
  17.      * 构造方法. 
  18.      *  
  19.      * @param datePattern 
  20.      *            日期格式 
  21.      */  
  22.     public JsonDateProcessor(String datePattern) {  
  23.         try {  
  24.             dateFormat = new SimpleDateFormat(datePattern);  
  25.         } catch (Exception ex) {  
  26.             dateFormat = new SimpleDateFormat(DEFAULT_DATE_PATTERN);  
  27.         }  
  28.     }  
  29.   
  30.     public Object processArrayValue(Object value, JsonConfig jsonConfig) {  
  31.         return process(value);  
  32.     }  
  33.   
  34.     public Object processObjectValue(String key, Object value,  
  35.             JsonConfig jsonConfig) {  
  36.         return process(value);  
  37.     }  
  38.   
  39.     private Object process(Object value) {  
  40.         try {  
  41.             return dateFormat.format((Date) value);  
  42.         } catch (Exception e) {  
  43.             return "";  
  44.         }  
  45.     }  
  46. }  

 

 

这里我将java中date处理出错时返回"",包含当date为null情况。

 

当我将json转回java的时候,报错了:net.sf.json.JSONException: Error while setting property=date type class java.lang.String

 

看了下json-lib的源码,才发现Json转Java的时候,调用ezmorph-1.0.6.jar中的DateMorpher类有问题:如果date的格式错误或者为空(总之就是转换错误)的时候,没有对错误处理。

就在net.sf.ezmorph.object.DateMorpher的这一段

Java代码   收藏代码
  1. try{   
  2.        return dateParser.parse( strValue.toLowerCase() );  
  3.  } catch( ParseException pe ){   
  4.      // ignore exception, try the next format   
  5. }   

 

 

 所以我改成如下样子

 

Java代码   收藏代码
  1. try{  
  2.    return dateParser.parse( strValue.toLowerCase() );  
  3. }  
  4. catch( ParseException pe ){  
  5.    return null;  
  6. }  

 

 这样就行了。

测试代码:

 

Java代码   收藏代码
  1. package com.jrj.datamart.tmp;  
  2.   
  3. import net.sf.ezmorph.object.DateMorpher;  
  4. import net.sf.json.JSONObject;  
  5. import net.sf.json.util.JSONUtils;  
  6.   
  7. public class JsonToObjTest {  
  8.     public static void main(String[] args) {  
  9.         try {  
  10.             JSONObject jsonObject = new JSONObject();  
  11.             jsonObject.put("str""sssssss");  
  12.             jsonObject.put("date""");  
  13.             String[] dateFormats = new String[] { "yyyy-MM-dd" };  
  14.             JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(dateFormats));  
  15.             TmpObj obj = (TmpObj) JSONObject.toBean(jsonObject, TmpObj.class);  
  16.             System.out.println(obj);  
  17.         } catch (Exception e) {  
  18.             e.printStackTrace();  
  19.         }  
  20.   
  21.     }  
  22. }  

 

 

 运行结果:

 

Java代码   收藏代码
  1. com.jrj.datamart.tmp.TmpObj@5483cd[date=<null>,str=sssssss]   

  

这里的date就被转换成null了。

附件是我上传的编译过的ezmorph-1.0.6.jar。json-lib的jar没问题,有问题的是ezmorph,或者复写一个即可

你可能感兴趣的:(json)