Date型数据转成json数据时出现的问题

今天在项目中遇到2个问题,关于从数据库读取日期类型数据和将Date型数据解析成JSON.

  1. 问题1:
    在页面上希望显示的日期格式为:yyyy-MM-dd HH:mm:ss,而读取数据库数据时返回的是英文格式的日期时间.
  2. 问题2:
    需要传递json数据给页面.而在解析该Date类型的属性时,输出的json字符串却类似于这样显示为时间戳.
    1
    {"nanos":0,"time":-27076233600000,"minutes":0,"seconds":0,"hours":0,"month":11,"timezoneOffset":-480,"year":-789,"day":5,"date":22}  
    很明显这不是我们想要的.

问题1

首先在读取数据库时就返回英文格式日期时间,所以首先得解决该问题.
本人数据库里的字段类型是Tiemstamp
然后我尝试将javabean属性类型改为下面两种类型

  1. javabean的属性类型改为java.util.date, 进行数据库读取时,输出格式为英文的日期格式.
  2. javabean的属性类型改为java.sql.date, 进行数据读取时,同样输出为英文的日期格式.

这两种方式都尝试过,但返回的数据依然不是我们想要的格式.

解决方案:

首先将Javabean属性的类型改为java.sql.Timestamp

1
2
import java.sql.Timestamp;
private Timestamp createTime;

接着在框架的返回值类型那里同样映射为Timestamp.
以mybatis为例,在resultMap中增加jdbcType="TIMESTAMP"

1
2
<result column="message_createtime" property="createTime"
jdbcType="TIMESTAMP" />

这样子数据库读取后就会返回中文的日期格式.

问题2

现在问题1解决了,以为在解析json时就会顺其而然的解析成功了.
但是却将那个其中createTime转换成了时间戳的格式.这样的格式在页面上显示肯定是不行的.
问题出在json解析这一块,于是我想着是不是现在用的json解析jar包的问题呢?
第一次用的gson解析,第二次换成了json-lib来解析,发现还是有这样的问题.

解决方案:

使用Json-lib解决

于是就觉得这可能是个通病,打开谷歌一搜,看到如下如下文章(感谢该博主分享):
JSONObject转换JSON–将Date转换为指定格式

照做一遍问题解决了.


这是Json-lib提供的一个转换器接口,实现他之后,我们根据自己的需要进行转换.

  1. 第一步:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    public class JsonDateValueProcessor implements JsonValueProcessor {  

    // 转换的格式
    private String format ="yyyy-MM-dd HH:mm:ss";

    public JsonDateValueProcessor() {
    super();
    }

    public JsonDateValueProcessor(String format) {
    super();
    this.format = format;
    }


    @Override
    public Object processArrayValue(Object paramObject,
    JsonConfig paramJsonConfig) {
    return process(paramObject);
    }

    @Override
    public Object processObjectValue(String paramString, Object paramObject,
    JsonConfig paramJsonConfig) {
    return process(paramObject);
    }

    // 定义方法自己进行自定义处理.
    private Object process(Object value){
    if(value instanceof Date){
    SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.CHINA);
    return sdf.format(value);
    }
    return value == null ? "" : value.toString();
    }

    }
  2. 第二步
    在转换成json字符串之前进行配置.

    1
    2
    3
    4
    5
    // 在使用JSONObject之前创建JsonConfig对象
    JsonConfig jsonConfig = new JsonConfig();

    //注册我们自定义的date转换器
    jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());
  3. 第三步
    在使用JSONObject时,添加JsonConfig对象,例如我在把这个jsonMap转换为json时,就可以在后面加上jsonConfig对象.

    1
    JSONObject.fromObject(jsonMap, jsonConfig);

使用Gson解决.

在创建Gson对象的使用

1
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();

这样输出的数据就是yyyy-MM-dd HH:mm:ss我们看上有好感的格式了.