1. 程式人生 > >後臺date型別轉換為json字串時,返回前臺頁面的是long time值問題解決

後臺date型別轉換為json字串時,返回前臺頁面的是long time值問題解決

https://blog.csdn.net/zhanglf02/article/details/77770118

問題頁面回顧:

這裡寫圖片描述

本例環境和框架:maven工程+ssm框架+jdk1.7+tomcat7.0
解決方案:
解決方案分為兩種:
第一種:如果bo(實體類)對應的欄位(日期)型別為Date型別,用Jackson的註解@JsonFormat。
第二種:如果bo(實體類)對應的欄位(日期)型別為String型別,則在set方法上用字串擷取方式。
下面具體來說。

1.用Jackson的註解@JsonFormat

1.1 引入jackson的jar包

一個非常重要的點就是jackson的依賴引入。我一開始就用的註解,就是jar包沒引入完整導致不成功!需要的jar包是:jackson-core.jar,jackson-databind.jar,jackson-annotations.jar

,下面是pom.xml中引入的jackson依賴:

        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>

        <dependency>
            <groupId
>
com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.8.8</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId
>
jackson-databind</artifactId> <version>2.8.8</version> </dependency>

  • 這時整個專案用到的所有jackson有關的jar包:

這裡寫圖片描述
1.2 在查詢對映對應的實體類(bo)對應變數或者該變數的get方法上加上註解@JsonFormat

import java.util.Date;

import com.fasterxml.jackson.annotation.JsonFormat;

public class JiJinBo {

    private Date jiJinTime;

    //設定時區為上海時區,時間格式自己據需求定。
    @JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")
    public Date getJiJinTime() {
        return jiJinTime;
    }

    public void setJiJinTime(Date jiJinTime) {
        this.jiJinTime = jiJinTime;
    }

完成以上兩步就可以了。在頁面可以現實正常的時間格式:
這裡寫圖片描述

2.在set方法上用字串擷取方式

2.1 關於jackson依賴

這裡就不用引入上面說的依賴。對應的pom.xml引入依賴僅留下這一個:

        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>

對應的jar包如下:

這裡寫圖片描述

2.2 在查詢對映對應的實體類(bo)對應變數或者該變數的set方法上擷取字串為yyyy-MM-dd型別。

import java.util.Date;

public class JiJinBo {

    private String jiJinTime;

    public String getJiJinTime() {
        return jiJinTime;
    }

    public void setJiJinTime(String jiJinTime) {
        this.jiJinTime = jiJinTime.substring(0,10);
    }

完成這兩步也就可以實現同樣正常日期格式的頁面效果。

3.總結

本次問題解決的關鍵是理解為什麼要在get方法上加註解就能解決日期現實問題和在set方法上加上字串擷取就可以實現同樣的效果?

1.實體類bo的get,set方法除了我們主動呼叫來為其賦值取值或者改變值外,實際我們每次從資料庫查詢出結果,返回到前臺頁面都會隱形用到這些方法。
我們按條件查詢時,查詢條件我們主動呼叫set方法封裝到bo中,等查詢出結果後,框架會主動呼叫set方法,把查詢出來的key-value形式的值賦值給對應對映的實體bo的屬性上。當返回頁面現實每個bo資訊時,框架會主動呼叫bo的get方法去取值。
所以,我們會在get方法上加上jackson註解,讓日期格式經處理後在返回到頁面。我們在set方法上會先處理查詢出來的資料,然後賦值給bo.

2.關於資料庫欄位為日期型別時,我們對應的bo其實有兩個選擇。用Date型別或者String型別都是可以的。實際資料庫中我們自己寫sql時,為日期型別賦值不也是 jijintime) values(‘2017-03-29’)這種字串形式嘛。所以不一定用Date。兩外注意,一定不能在bo中用timestamp來作為屬性的型別。這個忘了為啥了,反正不支援。