最近写案例使用到了json-lib中的JSONObject,将JavaBean转换为json字符串,以及将json字符串转换为JavaBean对象。
但是JSONObject只支持java.util.Date,而我们在JavaBean中存在java.sql.Date的属性时,会抛出异常(日志警告):
Can't transform property 'xxx' from java.lang.String into java.sql.Date. Will register a default Morpher
因此,查阅网上很多资料,有自己写一个JSONUtil类,来自己手动解析的;也有仿照源码,仿照JsonConfig的“jConfig.registerJavaPropertyNameProcessor(...)”方法,自己添加一个registerJavaValueProcessor()的方法,以在解析java.sql.Date时,自己new一个java.sql.Date返回去。
上面的方法都比较繁琐,我换了一种思路,既然JsonConfig支持设置“DateMorpher”来支持将“1997-7-1”此种字符串转换为标准的java.util.Date对象。
用于测试的Man类:
public class Man{
private String name;
private java.util.Date birthday;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public java.util.Date getBirthday() {
return birthday;
}
public void setBirthday(java.util.Date birthday) {
this.birthday = birthday;
}
}
测试类:
public class Test {
public static void main(String[] args) {
String jsonStr = "{\"person\" : {\"name\" : \"张三\", \"birthday\" : \"1997-7-1\"}}";
JSONObject obj = JSONObject.fromObject(jsonStr);
String[] formats = {"yyyy-MM-dd"};
JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(formats));//关键之处,通过它就能够解析“1997-7-1”
Man person = (Man) JSONObject.toBean(obj.getJSONObject("person"), Man.class);
System.out.println("姓名:" + person.getName() + ",生日:" + person.getBirthday());
}
}
运行后,输出结果为:姓名:张三,生日:Tue Jul 01 00:00:00 CST 1997,日期格式我们没有格式化,但证明标准的java.util.Date是能转换的!
但我们把Man中的生日修改为java.sql.Date,