注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

让一切都逝去吧

排骨炖泥菜/猪肝炒苹果/鱼籽狗肉汤/狗头薏米汤

 
 
 

日志

 
 

Jackson 自定义格式化日期  

2013-09-09 18:07:31|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
      Jackson格式化日期一般都是这个例子
public class CustomDateSerializer extends JsonSerializer<Date> {  
  
        @Override  
        public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {  
                SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");  
                String formattedDate = formatter.format(value);  
                jgen.writeString(formattedDate);  
        }  
}

@JsonSerialize(using = CustomDateSerializer.class)  
public Date getCreateAt() {  
        return createAt;  
}
      这样要在每个属性上进行标识,比较麻烦,于是想弄个可以统一处理的方式。Jackson 2使用registerModule的方式注册自定义的module。
ObjectMapper mapper = super.createObjectMapper();
UTCDateDeserializer utcDateDeserializer = new UTCDateDeserializer();
SimpleModule newModule = new SimpleModule("UTCDateDeserializer", PackageVersion.VERSION);
newModule.addDeserializer(Date.class, utcDateDeserializer);
mapper.registerModule(newModule);
UTCDateDeserializer是自定义的类
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.log4j.Logger;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.xxx.ReflectUtils;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.DateDeserializers.DateDeserializer;

public class UTCDateDeserializer extends DateDeserializer {
private Logger logger = Logger.getLogger(getClass());
private static final long serialVersionUID = -6218693745160760598L;

@Override
protected Date _parseDate(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
Date _parseDate = null;
try {
_parseDate = super._parseDate(jp, ctxt);
} catch (Exception ex) {
logger.trace(ex.getMessage(), ex.getCause());
String dateStr = jp.getText().trim();
DateFormat sourceDf = ctxt.getConfig().getDateFormat();
if (sourceDf != null && sourceDf instanceof SimpleDateFormat) {
String pattern = (String) ReflectUtils.getFieldValue(sourceDf, "pattern");
DateTime dt = DateTimeFormat.forPattern(pattern).parseDateTime(dateStr);
_parseDate = dt.toDate();
}
}
return _parseDate;
}

}
这里要求ObjectMapper设置里对应的SimpleDateFormat才有效,由于jdk中默认的DateFormat格式化不了后面+08:00的日期字符串,只能格式化+0800(无冒号)这样的日期字符串,就使用了joda time的包。而当你获得了设置的SimpleDateFormat的对象实例后,知道它有个属性pattern却无法获得(private),于是就用反射的方式拿到了值:yyyy-MM-dd'T'HH:mm:ssZ(使用ReflectUtils工具类)。如此这样就能按照自定义方式统一格式化日期类型。
      在查看jackson源码的时候,发现或许有其他方式可以处理这个问题。在下面这个类
com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateBasedDeserializer
有个属性_customFormat,是javax.text.DateFormat类型的,如果能设置这个属性,也许可以实现自定义。
      另外引入下面这个jar包
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-joda</artifactId>
<version>${jackson.version}</version>
</dependency>
      可以注册joda的jackson module
mapper.registerModule(new JodaModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
但是目前还没有去看让jackson使用JodaModule该如何去做。
  评论这张
 
阅读(5544)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017