用到net.sf包里json转换工具,结果时间戳或者格式化后的yyy/mm/dd总是转换为当前系统时间,看了下源码原来是格式转换有问题,整理了几种解决方案
一. 异常现象
使用toBean转换时并不抛出异常,而是在日志中打出以下警告信息:
Can't transform property 'birthday' from java.lang.String into java.util.Date. Will register a default Morpher
由于是warning,所以很容易让人忽略(我当时就没在意,逃)
二. 解决方案
向JSONutils注册新的时间格式化方法
① 简单化注册
直接在业务类使用toBean前加入
//自己定义的时间格式化格式
String[] dateFormats = new String[] {"yyyy-MM-dd"};
JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(dateFormats));
如果不好用,就加上静态块
static{
String[] dateFormats = new String[] {"yyyy-MM-dd"};
JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(dateFormats));
}
② 新增类,继承AbstractObjectMorpher
public class MyTimestamp2DateMorpher extends AbstractObjectMorpher{
public boolean supports(Class clazz){
return Long.class.isAssignableFrom(clazz);
}
public Object morph(Object value) {
if( value != null){
//具体的实现方法,这里是timestamp转date,还可以用不同的String格式化的方案
return new Date(Long.parseLong(String.valueOf(value)));
}
return null;
}
public Class morphsTo() {
return Date.class;
}
}
调用toBean前
JSONUtils.getMorpherRegistry().registerMorpher(new TimestampToDateMorpher());
Comments | NOTHING