我在处理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,或者复写一个即可