javascript
在SpringMVC中使用Jackson并格式化时间
在spring?MVC 3中,要實(shí)現(xiàn)REST風(fēng)格的JSON服務(wù),最簡單的方式是使用?@ResponseBody?注解。該注解會(huì)自動(dòng)把返回的對(duì)象,序列化為JSON。
來看一個(gè)最簡單的例子。這個(gè)例子先使用Spring 3.0.5 + Jackson1.7.1。Jackson是Spring使用的JSON序列化/反序列化第三方庫。
pom.xml 的主要內(nèi)容如下
<!-- Spring Framework Dependencies --><dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>3.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>3.0.5.RELEASE</version> </dependency> <!-- jackson json --> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.7.1</version> </dependency>再定義了一個(gè) POJO 對(duì)象 TestParams,由Controller的doTestQuery方法中返回該對(duì)象。
public class TestParams { private Date formatTime; private Date originTime; private int i; public Date getFormatTime() { return formatTime; } public Date getOriginTime() { return originTime; } public int getI() { return i; } public void setFormatTime(Date formatTime) { this.formatTime = formatTime; } public void setOriginTime(Date originTime) { this.originTime = originTime; } public void setI(int i) { this.i = i; } } @ResponseBody @RequestMapping(value="/test", method=RequestMethod.GET) public Object doTestQuery() { TestParams params = new TestParams(); params = new TestParams(); Date now = new Date(); params.setFormatTime(now); params.setOriginTime(now); return params; }請(qǐng)求示例URL ,瀏覽器返回
{"formatTime": 1412509897631, "originTime": 1412509897631, "i": 0 }并且返回的報(bào)文內(nèi)容類型也是妥妥的:?Content-Type:application/json;charset=UTF-8
只是時(shí)間看起來挺別扭。
默認(rèn)情況下Jackson將?Java.util.Date?序列化為?epoch timestamp,并且時(shí)區(qū)使用的是?GMT標(biāo)準(zhǔn)時(shí)間,而非本地時(shí)區(qū)。
“因?yàn)檫@樣最有效且準(zhǔn)確”。
Why do Dates get written as numbers?
Default serializer for java.util.Date (and related, such as java.util.Calendar) serialize them using the most efficient accurate representation, so-called epoch timestamp (number of milliseconds since January 1st, 1970, UTC). Assumption is that if user does not care, we should use efficient and accurate representation to get job bdone
如果你開發(fā)過跨大洲跨時(shí)區(qū)的web站點(diǎn),就會(huì)知道上面的話是實(shí)踐出真知。
那么當(dāng)我想要一個(gè)可讀性良好的時(shí)間格式,該怎么做呢?
在Jackson1.x時(shí)代,可以擴(kuò)展?JsonSerializer,來實(shí)現(xiàn)一個(gè)格式化時(shí)間的JsonDateSerializer,并在注解中引用這個(gè)類
@JsonSerialize(using=JsonDateSerializer.class) public Date getDate() { return date; }具體可以參見《How to Serialize Java.util.Date with Jackson JSON Processor / Spring 3.0》。
這種方法讓人愛不起來,又弱又麻煩的感覺。
進(jìn)一步查詢,發(fā)現(xiàn)有一個(gè)注解?@JsonFormat?可以方便的格式化時(shí)間字段。
但這個(gè)注解看了下只在 Jackson2 才有。于是我陷入了Spring 版本和Jackson2的迷思中,一番折騰。
如果不想使用?@JsonFormat?注解,jackson-mapper-asl仍然可以使用1.x的版本,來搭配 Spring 3.x系列。
如果想使用?@JsonFormat?注解,需要將Spring升級(jí)到?3.1.2?以上。
并且要將Jackson的jar包更換為2.x系列的(和1.x系列相比,包名都換了)。
升級(jí)后的pom.xml如下:
<!-- Spring Framework Dependencies --><dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>3.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework<groupId> <artifactId>spring-webmvc</artifactId> <version>3.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>3.2.4.RELEASE</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.2.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.2.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.2.3</version> </dependency>這時(shí)候可以在 TestParams 愉快地加上注解
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date formatTime;再次訪問測(cè)試URL,返回JSON對(duì)象如下
{"formatTime": "2014-10-05 20:20:15", "originTime": 1412511615062, "i": 0 }本文轉(zhuǎn)自二郎三郎博客園博客,原文鏈接:http://www.cnblogs.com/haore147/p/7212594.html,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的在SpringMVC中使用Jackson并格式化时间的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Curator] Path Cache
- 下一篇: ScrollViewer滚动究竟来触发载