springmvc中使用jackson-mapper-asl即可进行json输出,在配置上有几点:
1 <dependency> 2 <groupId>org.codehaus.jackson</groupId> 3 <artifactId>jackson-mapper-asl</artifactId> 4 <version>${jackson.version}</version> 5 </dependency>
mvc:annotation-driven默认加载了json转换器,我们添加了上面的依赖包后就可以使用注解@ResponseBody来返回json数据,比如:
1 @RequestMapping("json") 2 @ResponseBody 3 public List<User> userList(ModelMap modelMap){ 4 UserExample example = new UserExample(); 5 example.createCriteria().andUsernameIsNotNull(); 6 List<User> users = userMapper.selectByExample(example); 7 return users; 8 }
上面虽然输出了json,但json的date类型的属性都是long值,像在页面取出是国外的日期格式一样,我们需要加一个格式转换,将日期的格式转换成想要的格式:yyyy-MM-dd。
在实体类的getter方法上面添加@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") 就可以将json的日期格式化。
我第一次尝试总是失败,后来添加完整的依赖包后成功,需要添加如下几个依赖:
1 <!-- json数据 --> 2 <dependency> 3 <groupId>org.codehaus.jackson</groupId> 4 <artifactId>jackson-mapper-asl</artifactId> 5 <version>${jackson.version}</version> 6 </dependency> 7 <dependency> 8 <groupId>com.fasterxml.jackson.core</groupId> 9 <artifactId>jackson-core</artifactId> 10 <version>${jackson.core.version}</version> 11 </dependency> 12 <dependency> 13 <groupId>com.fasterxml.jackson.core</groupId> 14 <artifactId>jackson-databind</artifactId> 15 <version>${jackson.core.version}</version> 16 </dependency> 17 18 19 <properties> 20 <jackson.version>1.9.13</jackson.version> 21 <jackson.core.version>2.4.2</jackson.core.version> 22 </properties>
优点是简单方便,缺点是需要在每个需要的属性的getter方法上面添加。宏观的看比较繁琐,但实际开发中也就一行代码的事情,唯一不好的是mybatis自动生成实体类会覆盖。
参考:http://aokunsang.iteye.com/blog/1878985
在上面的方法中虽然简单方便,但缺点也很明显,自动生成代码会覆盖实体类,而且每个日期属性都要手动添加,实际中日期属性又是普遍必备。因此,大可全局处理,统一格式。这里需要说下,在数据库中的date和timestamp都会被mybatis转换成date对象。至于生日精确到日、时间精确到到秒的格式规范可以让显示层做处理。统一成yyyy-MM-dd HH:mm:ss
MappingJacksonHttpMessageConverter主要通过ObjectMapper来实现返回json字符串。这里我们继承该类,注册一个JsonSerializer<T>。然后在配置文件中注入自定义的ObjectMapper。
1 package com.demo.common.util.converter; 2 3 import org.codehaus.jackson.JsonGenerator; 4 import org.codehaus.jackson.JsonProcessingException; 5 import org.codehaus.jackson.map.JsonSerializer; 6 import org.codehaus.jackson.map.ObjectMapper; 7 import org.codehaus.jackson.map.SerializerProvider; 8 import org.codehaus.jackson.map.ser.CustomSerializerFactory; 9 10 import java.io.IOException; 11 import java.text.SimpleDateFormat; 12 import java.util.Date; 13 14 /** 15 * 解决Date类型返回json格式为自定义格式 16 * Created by Administrator on 2016/2/14. 17 */ 18 public class CustomJsonDateConverter extends ObjectMapper { 19 public CustomJsonDateConverter(){ 20 CustomSerializerFactory factory = new CustomSerializerFactory(); 21 factory.addGenericMapping(Date.class, new JsonSerializer<Date>(){ 22 @Override 23 public void serialize(Date value, 24 JsonGenerator jsonGenerator, 25 SerializerProvider provider) 26 throws IOException { 27 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 28 jsonGenerator.writeString(sdf.format(value)); 29 } 30 }); 31 this.setSerializerFactory(factory); 32 } 33 }
1 <mvc:annotation-driven> 2 <mvc:message-converters> 3 <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 4 <property name="objectMapper" ref="customObjectMapper"></property> 5 </bean> 6 </mvc:message-converters> 7 </mvc:annotation-driven> 8 <bean id="customObjectMapper" class="com.demo.common.util.converter.CustomJsonDateConverter"></bean>
这个配置无法和上一个@JsonFormat共同使用。由于全局统一了日期格式,date和datetime以及timestamp都是一个格式,如果生日等date字段需要精简,只能在显示层裁剪。
同样是全局设置json响应的日期格式,但此方法可以和@JsonFormat共存,也就是说可以全局设置一个格式,特定的需求可以使用注解设置。
<mvc:annotation-driven> <!-- 处理responseBody 里面日期类型 --> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="dateFormat"> <bean class="java.text.SimpleDateFormat"> <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss" /> </bean> </property> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
@JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8") public Date getBirth() { return birth; }