在spring MVC 3中,要实现REST风格的JSON服务,最简单的方式是使用 @ResponseBody 注解。该注解会自动把返回的对象,序列化为JSON。

来看一个最简单的例子。这个例子先使用Spring 3.0.5 + Jackson1.7.1。Jackson是Spring使用的JSON序列化/反序列化第三方库。

pom.xml 的主要内容如下

    <!-- 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>

再定义了一个 POJO 对象 TestParams,由Controller的doTestQuery方法中返回该对象。

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; }

请求示例URL ,浏览器返回

{"formatTime": 1412509897631, "originTime": 1412509897631, "i": 0 }

并且返回的报文内容类型也是妥妥的: Content-Type:application/json;charset=UTF-8

只是时间看起来挺别扭。

默认情况下Jackson将 Java.util.Date 序列化为 epoch timestamp,并且时区使用的是 GMT标准时间,而非本地时区。

“因为这样最有效且准确”。

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

如果你开发过跨大洲跨时区的web站点,就会知道上面的话是实践出真知。

那么当我想要一个可读性良好的时间格式,该怎么做呢?

在Jackson1.x时代,可以扩展 JsonSerializer,来实现一个格式化时间的JsonDateSerializer,并在注解中引用这个类

@JsonSerialize(using=JsonDateSerializer.class) public Date getDate() { return date; }

具体可以参见《How to Serialize Java.util.Date with Jackson JSON Processor / Spring 3.0》。

这种方法让人爱不起来,又弱又麻烦的感觉。

进一步查询,发现有一个注解 @JsonFormat 可以方便的格式化时间字段。

但这个注解看了下只在 Jackson2 才有。于是我陷入了Spring 版本和Jackson2的迷思中,一番折腾。

如果不想使用 @JsonFormat 注解,jackson-mapper-asl仍然可以使用1.x的版本,来搭配 Spring 3.x系列。

如果想使用 @JsonFormat 注解,需要将Spring升级到 3.1.2 以上。
并且要将Jackson的jar包更换为2.x系列的(和1.x系列相比,包名都换了)。

升级后的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>

这时候可以在 TestParams 愉快地加上注解

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date formatTime;

再次访问测试URL,返回JSON对象如下

{"formatTime": "2014-10-05 20:20:15", "originTime": 1412511615062, "i": 0 }

本文转自二郎三郎博客园博客,原文链接:http://www.cnblogs.com/haore147/p/7212594.html,如需转载请自行联系原作者

在SpringMVC中使用Jackson并格式化时间相关推荐

  1. jquery中使用moment.js格式化时间

    moment.js官网 页面中引入文件 <script type="text/javascript" src="/public/front/js/moment.mi ...

  2. mvc json 乱码_你了解JSON吗?——Jackson、FastJson在SpringMVC中的简单使用

    原文参考分享自CSDN:你了解JSON吗?--Jackson.FastJson在SpringMVC中的简单使用_欢迎来到 Baret~H 的博客-CSDN博客 1. 什么是 JSON JSON(Jav ...

  3. spring mvc 用注解和在sql中格式化时间的案例

    spring mvc 用注解和在sql中式化时间的案例: 我们用spring mvc框架做项目的时候从数据库里面取出的时间经常是一串数字(如:1357826031724),比较让人头痛: 下面介绍中方 ...

  4. Sql server2005中如何格式化时间日期

    执行下面格式化时间和日期的T-SQL脚本,在数据库查询分析器中示范了SQL Server中的大多数可用的时间数据格式.首先我们开始转换sql的一些可用的时间格式.?SELECT convert(var ...

  5. vue 中格式化时间 过滤器格式化时间

    vue 中格式化时间 过滤器格式化时间 data.js 格式化方法使用 * // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s) ...

  6. Java中随心所欲格式化时间(快刀斩乱麻)

    YJava中随心所欲格式化时间(快刀斩乱麻) 最近在南航电子商务公司做feinar的项目的后期功能中的PNR(Pessenger Name Record)的解析,由于要使用中航信的IBE开发包,里面的 ...

  7. Vue在表格中格式化时间

    在获取数据的时候时间显示的方式是毫秒 那么可以通过在Vue原型上过载一个时间的过滤器函数去格式化时间 首先,找到main.js入口文件 Vue.filter('dataFormat',function ...

  8. 如何通过数据库SQL Server 2014中的SQL日期格式化语句来转换出我们需要的日期格式化日期时间格式转换的教程方法

    如何通过数据库SQL Server 2014中的SQL日期格式化语句来转换出我们需要的日期格式化日期时间格式转换的教程方法 作者:张国军_Suger 开发工具与关键技术:SQL Server 2014 ...

  9. java simpledateformat星期_Java中随心所欲格式化时间 SimpleDateFormat

    SimpleDateFormat 是一个以与语言环境相关的方式来格式化和分析日期的具体类.它允许进行格式化(日期 -> 文本).分析(文本 -> 日期)和规范化.SimpleDateFor ...

最新文章

  1. do {...} while (0) 在宏定义中的作用
  2. PyTorch基础(二)-----自动求导Autograd
  3. spring cloud eureka服务注册和调用
  4. java processrequest_java-如何在camera2 API中使用reprocessCaptureRequest
  5. iOS 如何使用 Block
  6. Arcgis 10.1安装
  7. 我大学时代的好朋友要结婚了!
  8. k3cloud新建简单帐表教程
  9. 苹果有益让老iPhone变慢以迫使消费者购买新一代的iPhone?
  10. 一种传统发酵彝药有效抑制新冠病毒的复制体外研究
  11. CH340串口驱动(包含各系统平台)
  12. Windows Latex写作之VScode + TeX Live
  13. 放不下的原理_通俗易懂,几张图看懂大数据存储和计算原理
  14. 【012】SylixOS嵌入式实时操作系统助力中国航天事业
  15. Typora崩溃 与 设置备份
  16. veu中时间转换----element-UI上Date-Picker时间控件
  17. 信修修:固态硬盘各式样,对比起来哪家强?
  18. 怎么关闭计算机139端口,如何关闭135、139、138、137、445端口的方法 关闭电脑端口教程...
  19. ubuntu删除虚拟网卡
  20. 试题六(java+设计模式)

热门文章

  1. 第 21 章 radiusd - Authentication, Authorization and Accounting server
  2. Hibernate与 MyBatis的比较
  3. Activity和ListActivity的区别
  4. Guava 2.2-新集合类型
  5. HTML DOM简介
  6. JDK 1.6 HashMap 源码分析
  7. CentOS 6.x安装配置MongoDB 3.4.x
  8. thinkphp隐藏后台地址
  9. PHP实现支付宝即时到账功能
  10. 大道至简第三章读后感