上一篇「ASP.NET MVC, JSON資料的日期轉換與格式化 1」說明了後端序列化的JSON日期資料要如何轉換以及格式化,
然而我們在後端所用的序列化JSON是直接使用ASP.NET MVC的預設內部方法,也就是用JavascriptSerializer來做序列化,
而之前有好幾篇文章也有說明到各種的在後端序列化的方式,
所以這一篇我們就來看看各種的序列化方式的JSON日期轉換與格式化。
首先我們先來看看要測試的前端畫面
會用五種方式來做測試,五種測試方式的結果都應該相同。
- Use Regular Expression and format date by f
 - Use SubStr and format date by dateFormat(modified)
 - Use SubStr and format date by f
 - Use json4ms and format date by f
 - Use json4ms and format date by jquery-dateFormat
 
使用JsonResult, and return Json() 方式
這是最基本的方式,首先來看看後端的程式:
public JsonResult GetNodesJson(){var collection = service.GetCollection().OrderBy(x => x.CreateDate).Select(x => new{ID = x.ID,Name = x.Name,Sort = x.Sort,CreateDate = x.CreateDate,UpdateDate = x.UpdateDate});return Json(collection, JsonRequestBehavior.AllowGet);}
接下來看看前端的Javascript的程式處理:
function LoadJsonData(convertMethod){    $.ajax({        url: '<%= Url.Action("GetNodesJson", "Test") %>',        type: 'post',        dataType: 'json',        async: false,        cache: false,        success: function (data)        {            if (data)            {                var content = convertMethod;                switch (convertMethod)                {case "LoadJsonData1":
content += " , " + $('#Button1').val() +" <br/><br/>";
                        break;case "LoadJsonData2":
content += " , " + $('#Button2').val() +" <br/><br/>";
                        break;case "LoadJsonData3":
content += " , " + $('#Button3').val() +" <br/><br/>";
                        break;case "LoadJsonData4":
content += " , " + $('#Button4').val() +" <br/><br/>";
                        break;case "LoadJsonData5":
content += " , " + $('#Button5').val() +" <br/><br/>";
                        break;}
                $.each(data, function (i, item)                {                    content += "Name: " + item.Name;                    content += " || CreateDate: " + item.CreateDate;                    switch (convertMethod)                    {case "LoadJsonData1":
content += " || CreateDate(Formatted): " + ConvertWithRegex(item.CreateDate) + "<br>";
                            break;case "LoadJsonData2":
content += " || CreateDate(Formatted): " + ConvertWithdateFormat(item.CreateDate) + "<br>";
                            break;case "LoadJsonData3":
content += " || CreateDate(Formatted): " + ConvertWithF(item.CreateDate) + "<br>";
                            break;case "LoadJsonData4":
content += " || CreateDate(Formatted): " + ConvertWithJson4msAndF(item.CreateDate) + "<br>";
                            break;case "LoadJsonData5":
content += " || CreateDate(Formatted): " + ConvertWithJson4msAndjqueryDateFormat(item.CreateDate) + "<br>";
                            break;}
});
                $('#JsonContent').html(content);}
}
});
}
function ConvertWithRegex(jsonDate, formatString){    if ($.trim(formatString).length == 0)    {        formatString = "yyyy-MM-dd HH:mm:ss";}
return (eval(jsonDate.replace(/\/Date\((.*?)\)\//gi, "new Date($1)"))).f(formatString);
}
function ConvertWithdateFormat(jsonDate, formatString){    if ($.trim(formatString).length == 0)    {        formatString = "yyyy-MM-dd HH:mm:ss";}
return (new Date(parseInt(jsonDate.substr(6)))).format(formatString);
}
function ConvertWithF(jsonDate, formatString){    if ($.trim(formatString).length == 0)    {        formatString = "yyyy-MM-dd HH:mm:ss";}
return new Date(parseInt(jsonDate.substr(6), 10)).f(formatString);
}
function ConvertWithJson4msAndF(m, formatString){    if ($.trim(formatString).length == 0)    {        formatString = "yyyy-MM-dd HH:mm:ss";}
    return JSON.parseWithDate(JSON.stringifyWcf(m)).f(formatString);}
function ConvertWithJson4msAndjqueryDateFormat(m, formatString){    if ($.trim(formatString).length == 0)    {        formatString = "yyyy-MM-dd HH:mm:ss";}
    return $.format.date(JSON.parseWithDate(JSON.stringifyWcf(m)), formatString);}
執行結果:
不管是用哪一種轉換JSON日期資料與日期格式化的方式,所得到的結果都是一樣的。
使用Json.NET, JsonConvert.SerializeObject()方式
這個方式就是在後端使用Json.NET來對資料做序列化的操作,看看程式的內容:
public ActionResult GetNodesJsonByJsonNet(){var collection = service.GetCollection().OrderBy(x => x.CreateDate);JArray ja = new JArray();foreach (var item in collection){JObject jo = new JObject();jo.Add("ID", item.ID.ToString());jo.Add("Name", item.Name);jo.Add("Sort", item.Sort);jo.Add("CreateDate", item.CreateDate);jo.Add("UpdateDate", item.UpdateDate);ja.Add(jo);}return Content(JsonConvert.SerializeObject(ja), "application/json");}
而前端程式的部份,除了使用後端Controller/Action的地方不一樣之外,其餘的都一樣,所以就不用再貼出程式。
以下是各種前端處理方式的執行結果:
上面五個方式的執行結果,如果有仔細的去比對,可以看出來第一個結果與其他四個的執行結果是有些不一樣的,
以下面的圖在與上面的突來做個比較,
可以看到第一個用正則式來解析 \/Date(Tick)\/ 的資料後再去轉為日期物件,有些結果會多個一秒,
再來看看原始的資料:
在前端使用正則式來解析 \/Date(Tick)\/ 資料後再轉換日期最後做日期格式化(不論是用哪一種格式化方法)
milliseconds在200ms以上都會做進位的動作,所以要注意一下這個地方的差異。
使用JsonResult, return CustomJson() , EFSimpleJavascriptSerializer, EFJavascriptSerializer 方式
後端的程式:
這邊的後端程式比較簡潔,因為使用EFSimpleJavascriptSerializer與EFJavascriptSerializer不用再做指定物件欄位的動作,
public JsonResult GetNodesJsonByCutsomJson(){var collection = service.GetCollection().OrderBy(x => x.CreateDate);return CustomJson(collection, JsonRequestBehavior.AllowGet);}
而前端程式的部份,除了使用後端Controller/Action的地方不一樣之外,其餘的都一樣,所以就不用再貼出程式。
以下是各種前端處理方式的執行結果:
這個方式的執行結果都是一樣的,也與第一個方式的結果是一致的。
另外就是,如果你會覺得總是需要單獨對後端所產生的JSON資料裡的日期做轉換處理會很麻煩,
其實也可以使用json4ms.js對整個JSON資料去做轉換,而當資料內是為日期時,就會去做轉換,而其他的資料不會影響到,
前端程式的內容如下:
function LoadJsonDataStandalone(){$.ajax({url: '<%= Url.Action("GetNodesJson", "Test") %>',type: 'post',dataType: 'json',async: false,cache: false,success: function (data){if (data){var jsonData = JSON.parseWithDate(JSON.stringifyWcf(data));var content = $('#Button6').val() + " <br/><br/>";$.each(jsonData, function (i, item){content += "Name: " + item.Name;content += " || Sort: " + item.Sort;content += " || CreateDate: " + item.CreateDate;content += " || CreateDate(Formatted): " + item.CreateDate.f("yyyy-MM-dd HH:mm:ss");content += "<br/>";});$('#JsonContent').html(content);}}});}
可以看到程式中,先把後端傳回來的JSON資料先做JSON.stringifywfc()的轉換後,再用JSON.parseWithDate()去做日期資料的解析,
如此一來,原本的的CreateDate資料就會轉換成GMT的日期格式,如果有需要的話,還可以使用格式化套件去轉乘我們要的日期格式。
執行結果:
延伸閱讀:
使用Entity Framework 將物件轉為JSON時遇到循環參考錯誤 3
ASP.NET MVC + JSON 自定義JsonResult 2
ASP.NET MVC, JSON資料的日期轉換與格式化 1
 
以上
沒有留言:
張貼留言