Json-lib在Json转Java时日期为空处理出错的解决办法

 

 

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

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

出错的具体情况如下:

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

 

 

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;

public class JsonDateProcessor implements JsonValueProcessor {
	public static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd";
	private DateFormat dateFormat;

	public JsonDateProcessor() {
		dateFormat = new SimpleDateFormat(DEFAULT_DATE_PATTERN);
	}

	/**
	 * 构造方法.
	 * 
	 * @param datePattern
	 *            日期格式
	 */
	public JsonDateProcessor(String datePattern) {
		try {
			dateFormat = new SimpleDateFormat(datePattern);
		} catch (Exception ex) {
			dateFormat = new SimpleDateFormat(DEFAULT_DATE_PATTERN);
		}
	}

	public Object processArrayValue(Object value, JsonConfig jsonConfig) {
		return process(value);
	}

	public Object processObjectValue(String key, Object value,
			JsonConfig jsonConfig) {
		return process(value);
	}

	private Object process(Object value) {
		try {
			return dateFormat.format((Date) value);
		} catch (Exception e) {
			return "";
		}
	}
}

 

 

这里我将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的这一段

  try{ 
         return dateParser.parse( strValue.toLowerCase() );
   } catch( ParseException pe ){ 
       // ignore exception, try the next format 
  } 

 

 

 所以我改成如下样子

 

         try{
            return dateParser.parse( strValue.toLowerCase() );
         }
         catch( ParseException pe ){
            return null;
         }

 

 这样就行了。

测试代码:

 

package com.jrj.datamart.tmp;

import net.sf.ezmorph.object.DateMorpher;
import net.sf.json.JSONObject;
import net.sf.json.util.JSONUtils;

public class JsonToObjTest {
	public static void main(String[] args) {
		try {
			JSONObject jsonObject = new JSONObject();
			jsonObject.put("str", "sssssss");
			jsonObject.put("date", "");
			String[] dateFormats = new String[] { "yyyy-MM-dd" };
			JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(dateFormats));
			TmpObj obj = (TmpObj) JSONObject.toBean(jsonObject, TmpObj.class);
			System.out.println(obj);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

 

 

 运行结果:

 

com.jrj.datamart.tmp.TmpObj@5483cd[date=<null>,str=sssssss] 

  

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

附件是我上传的编译过的ezmorph-1.0.6.jar。json-lib的jar没问题,有问题的是ezmorph

你可能感兴趣的:(java,.net,json)