1. 程式人生 > >JAVA物件轉換為JSON時日期格式轉換處理

JAVA物件轉換為JSON時日期格式轉換處理

PS→無奈:受思深處宜先退,得意濃時便可休。

今天在返回json物件到前端時發現前端接收到的資料裡面的時間格式被拆開了,原因如下:

        預設JSON對DATE型別會轉換成一個多屬性物件, 而不是單獨的一個字串, 在某些應用處理上不是很方便,  可以利用JsonValueProcessor來實現日期的轉換.

 預設格式:

"createDate":{"nanos":0

          ,"time":1371721834000

          ,"minutes":50

          ,"seconds":34

          ,"hours":17

          ,"month":5

          ,"year":113

          ,"timezoneOffset":-480,"day":4

          ,"date":20

          },

此格式當然不是我們前端要展示的格式,所以我找各種方法解決了一下,引框架包含了hibernate,因此特記錄一下。

轉換之後的格式:"createDate":"2013-06-20 17:50:34"

後臺直接以此返回資料的話,後臺會報資料轉換錯誤:
SurveyDirectory survey=surveyDirectoryManager.getSurvey(id);
JSONObject jsonObject=JSONObject.fromObject(survey);
response.getWriter().println(jsonObject.toString());
解決辦法:使用hibernate延時載入 設定

JsonConfig cfg = new JsonConfig();  
  
cfg.setExcludes(new String[]{"handler","hibernateLazyInitializer"});  

時間格式問題解決方案:轉換時間格式

1.首先要在專案裡新增一個DateJsonValueProcessor類:

import java.text.SimpleDateFormat;
import java.util.Date;

import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;

/** 
 * JSON日期格式轉換
 * 
*/
public class DateJsonValueProcessor implements JsonValueProcessor
{
    private String format = "yyyy-MM-dd HH:mm:ss";

    public DateJsonValueProcessor()
    {

    }

    public DateJsonValueProcessor(String format)
    {

        this.format = format;
    }

    public Object processArrayValue(Object value, JsonConfig jsonConfig)
    {

        String[] obj = {};
        if (value instanceof Date[])
        {
            SimpleDateFormat sf = new SimpleDateFormat(format);
            Date[] dates = (Date[]) value;
            obj = new String[dates.length];
            for (int i = 0; i < dates.length; i++)
            {
                obj[i] = sf.format(dates[i]);
            }
        }
        return obj;
    }

    public Object processObjectValue(String key, Object value, JsonConfig jsonConfig)
    {

        if (value instanceof Date)
        {
            String str = new SimpleDateFormat(format).format((Date) value);
            return str;
        }
        return value;
    }

    public String getFormat()
    {

        return format;
    }

    public void setFormat(String format)
    {

        this.format = format;
    }

}

2.其次在需要呼叫的方法裡面使用如下程式碼
 

 cfg.registerJsonValueProcessor(Date.class, new DateJsonValueProcessor());
 JSONObject jsonObject=JSONObject.fromObject(survey,cfg);
 response.getWriter().println(jsonObject.toString());

最終解決問題方案如下案例:

 @ResponseBody
 @RequestMapping(value = "/my-survey!attrs")
 public String attrs(@RequestParam("id")String id) throws Exception {
    HttpServletResponse response=SpringUtils.getResponse();
    response.setCharacterEncoding("UTF-8");
    try{
      SurveyDirectory survey=surveyDirectoryManager.getSurvey(id);
      JsonConfig cfg = new JsonConfig();
      cfg.setExcludes(new String[]{"handler","hibernateLazyInitializer"});
      cfg.registerJsonValueProcessor(Date.class, new DateJsonValueProcessor());
      JSONObject jsonObject=JSONObject.fromObject(survey,cfg);
      response.getWriter().println(jsonObject.toString());
    }catch(Exception e){
       e.printStackTrace();
    }
    return null;
}

至此JSON日期格式轉換問題完美解決!!!