web 层采用 Spring MVC 框架,将查询到的数据传递给 APP 端或客户端,这没啥,但是坑的是实体类中有日期类型的属性,但是你必须提前格式化好之后返回给它们。说真的,以前真没这样做过,之前都是一口气查询到数据,然后在 jsp 页面上格式化,最后展示给用户。但是这次不同,这次我纯属操作数据,没有页面。直接从数据库拿数据给它们返数据、它们给我传数据我持久化数据,说到这里一个小问题就默默的来了。
首先把问题还原一下吧 (这是一个数据导出功能),下图中用红框圈起来的都是直接从数据库中拿到的数据,但是不幸的是它们的对象中都包含日期类型的属性,然后我直接使用 com.alibaba.fastjson.JSONObject 将其转成 json 串返回给 APP 端和客户端,但是他们拿到的数据中时间类型的值都是时间戳,很不人性化,我也觉的很不人性化,就答应给他们格式化一下,不料,问题来了,格式化好之后然后又设置进去,结果是没用,没用,没用,重要的事情说三遍!
解决上面出现的问题,格式化对象中的日期类型的属性值,然后返回给请求者。记住:这个动作是在服务器端完成,并且实体类和数据表中的类型也都不变,照样是日期类型的。
第一步:首先自定义一个日期类型转换器 (附代码)
- 1 package com.tgsit.cjd.utils;
- 3
- /**
- 4 * 日期类型转换器:
- 5 * 自动格式化对象中的日期类型
- 6 */
- 8 import java.text.SimpleDateFormat;
- 9 import java.util.Date;
- 10 import java.util.Locale;
- 12 import net.sf.json.JsonConfig;
- 13 import net.sf.json.processors.JsonValueProcessor;
- 15 public class JsonDateValueProcessor implements JsonValueProcessor {
- 17 private String format = "yyyy-MM-dd";
- 19 public JsonDateValueProcessor() {
- 20 super();
- 21
- }
- 23 public JsonDateValueProcessor(String format) {
- 24 super();
- 25 this.format = format;
- 26
- }
- 28@Override 29 public Object processArrayValue(Object paramObject, 30 JsonConfig paramJsonConfig) {
- 31
- return process(paramObject);
- 32
- }
- 34@Override 35 public Object processObjectValue(String paramString, Object paramObject, 36 JsonConfig paramJsonConfig) {
- 37
- return process(paramObject);
- 38
- }
- 41 private Object process(Object value) {
- 42
- if (value instanceof Date) {
- 43 SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.CHINA);
- 44
- return sdf.format(value);
- 45
- }
- 46
- return value == null ? "": value.toString();
- 47
- }
- 49
- }
第二步:如果项目中没有引入 json-lib 包,则引入
- 1 <dependency>
- 2 <groupId>net.sf.json-lib</groupId>
- 3 <artifactId>json-lib</artifactId>
- 4 <version>2.4</version>
- 5 <classifier>jdk15</classifier>
- 6</dependency>
第三步:返回数据之前先使用日期类型转换器格式化日期数据
这里必须先创建 JsonConfig 对象,然后调用 registerJsonValueProcessor(Date.class, new JsonDateValueProcessor()); 方法将转换器注入进去,最后在调用 JsonArray 的 formObject(数据, new JsonConfig()) 方法进行处理。
注意:这里还有个小坑,就是当你处理的是单纯的一个实体对象,则直接可以 jsonObject.formObject(数据, new JsonConfig());
但是你处理的一个 list 集合数据时,则记得用 jsonArray.formObject(数据, new JsonConfig()); 否则报错。
- 1@RequestMapping(value = "/exportInfo", method = RequestMethod.GET) 2@ResponseBody 3 public String exportInfo(HttpServletResponse response) throws Exception {
- 4 List exportInfoList = queryVoService.exportInfo();
- 5
- if (exportInfoList != null && exportInfoList.size() > 0) {
- 6 List result = new ArrayList();
- 7 JsonResult model = null;
- 8
- for (QueryVo queryVo: exportInfoList) {
- 9 OwnerInfo ownerInfo = ownerInfoService.selectOwnerInfoByVIN(queryVo.getVin());
- 10 List morInfoList = mortgagerInfoService.selectByVIN(queryVo.getVin());
- 11 List traInfoList = transferInfoService.selectByVIN(queryVo.getVin());
- 12 model = new JsonResult();
- 13 model.setOwnerInfo(ownerInfo);
- 14 model.setMortgagerInfo(morInfoList);
- 15 model.setTransferInfo(traInfoList);
- 16 result.add(model);
- 17
- }
- 18 //调用自定义日期类型转换器,自动格式化对象中的日期类型的字段值
- 19 JsonConfig jsonConfig = new JsonConfig();
- 20 jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());
- 21
- return CGSConstants.returnJson(CGSConstants.SUCCESS, "导出成功", JSONArray.fromObject(result, jsonConfig));
- 22
- }
- 23
- return CGSConstants.returnJson(CGSConstants.SUCCESS, "尚无数据", null);
- 24
- }
谢谢!
来源: http://www.cnblogs.com/1315925303zxz/p/6709703.html