首頁 > web前端 > js教程 > 主體

解決json日期格式問題的3種方法_json

WBOY
發布: 2016-05-16 17:01:38
原創
1364 人瀏覽過

開發中有時候需要從伺服器端返回json格式的數據,在後台代碼中如果有DateTime類型的數據使用系統自帶的工具類序列化後將得到一個很長的數字表示日期數據,如下所顯示:

複製程式碼 程式碼如下:

//設定伺服器回應的結果為純文字格式
            context.Response.ContentType = "text/plain";
          dent>
            {
               "Tom",
                    Birthday =Convert.ToDateTime("2014-01-31 12:12:12")),                    Birthday =Convert.ToDateTime ("2014-01-10 11:12:12")},
                new Student(){Name ="Mark 🠎>    vert.ToDateTime("2014-01-09 10:12:12 ")}
            };

            //javascript序列化器
            JavaScriptSerializer          string studentsJson=jss.Serialize(students);          / /將字串回應到客戶端

            context.Response.Write(studentsJson);
       
運行結果是:




其中Tom所對應生日「2014-01-31」變成了1391141532000,這其實是1970 年1 月1 日至今的毫秒數;1391141532000/1000/60/60/24/315,44. 1970=2014年,依此方法可以得出年月日時分秒和毫秒。這種格式是一種可行的表示形式但不是一般人可以看懂的友善格式,怎麼讓這個格式改變?

解決方法:

方法1:在伺服器端將日期格式使用Select方法或LINQ表達式轉換後發送到客戶端:

複製程式碼

程式碼如下:


使用 System;
使用 System.Collections.Generic;
使用 System.Web;

使用 System.Web.Script.Serialization;

命名空間 JsonDate1
{
    使用 System.Linq;

    ///


    /// 學生類,測驗使用
    ///

     🎜>        /// 姓名
        ///
        public String Name { getget;
        ///
        /// 生日
        //    }

    ///


    /// 回學生集合的json字元
    ///

    void ProcessRequest( HttpContext context)
        {

            //設定伺服器回應的結果為純文字格式            List< ;學生> Students = new List
            {
             2")},
new Student(){Name ="Rose",Birthday =Convert.ToDateTime("2014-01-10 11:12:12")},
           ToDateTime ("2014-01-09 10:12:12")}
            };

            //使用Select方法重新投影物件集合將生日屬性轉換成新的屬性
            🎜>                則可使用。Select
                (
                         ).ToList();

            //javascript序列化器
            JavaScriptSerializer jss              string StudentsJson = jss.Serialize(studentSet);
            / /將字串回應到客戶端
            context.Response.Write(studentsJson);       

        public bool IsReusable
        {
                      return false;
            }
      

Select方法重新投影物件集合將Birthday屬性轉換成一個新的屬性,注意屬性變更後要重新命名,屬性名稱可以相同;這裡可以使用select方法也可以使用LINQ查詢表達式,也可以選擇別的方式達到相同的目的;這種方法可以將集合中客戶端不用的屬性剔除,達到簡單優化效能的目的。

運行結果:

這時候的日期格式就已經變成友善格式了,不過在javascript中這只是一個字串。

方法二:

在javascript中將"Birthday":"/Date(1391141532000)/"中的字串轉換成javascript中的日期對象,可以將Birthday這個Key所對應的Value中的非數字字元以替換的方式刪除,到到一個數字1391141532000,然後實例化一個Date對象,將1391141532000毫秒作為參數,得到一個javascript中的日期對象,代碼如下:

複製程式碼 程式碼如下:









    json日期格式處理
       


   

json日期格式處理


   

     >
    身體>


運行結果:

上的使用正規/D/igm達到替換所有非數字的目的,D表示非數字,igm是參數,分別表示忽視(ignore)大小寫;多次、全域(global)替換;多行替換( multi-line);有些時候還會出現86的情況,只需要變換正規同樣可以達到目的。另外如果專案中反覆出現這種需要處理日期格式的問題,可以擴充一個javascript方法,程式碼如下:

複製程式碼 程式碼如下:

$(function () {
            $.getJSON("getJson.ashx", function (students) { . , obj) {
                  $ ("
  • ").html(obj.Name).appendTo("#ulStudents");
                      //使用正規表達式將生日屬性中的非數位(D)刪除

                            var birthdayMilliseconds = parseInt(obj.Birthday.replace(/ D/igm, ""));
                      //實例化一個新的日期格式,使用1970 年1 月1 日至今的毫秒irthday = new Date(birthdayMilliseconds);

                      $("

  • ").html(birthday.toLocaleString()).append   >").html(obj.Birthday.toDate ()).appendTo("#ulStudents");
                    });      

            //在String物件中擴充一個toDate方法,可依需求完善
            String.prototype.toDate = function () {   String.prototype.toDate = function () {   String.prototype.toDate = function () {           if (isNaN(this)) {
                    //使用正規表示式將日期屬性中的非數位(D)移除
                      } else {
                    dateMilliseconds=this;

                }

                //實例化一個新的日期格式,並使用1970 年1 月1 日至今的毫秒數為參數        };



    上面擴充的方法toDate不一定合理,也不夠強大,可以根據需要修改。

    方法三:

    可以選擇一些第三方的json工具類,其中不乏有一些已經對日期格式問題已處理好了的,常見的json序列化與反序列化工具庫有:

    1.fastJSON.
    2.JSON_checker.

  • 3.Jayrock.4.Json.NET - LINQ to JSON.

    5.LitJSON.

    6.JSON for .NET .

    7.JsonFx.

    8.JSONSharp.

    9.JsonExSerializer.

    10.fluent-json

    11.Manatee Json

    這裡以litjson為序列化與反序列化json的工具類別範例,程式碼如下:





    複製程式碼

    程式碼如下:


    using System;
    using System.Collections.Generic;
    using System.Web;

    using LitJson;

    namespace JsonDate2
    {
        using System.Linq;

        ///


        /// 學生類,測試使用
        ///

       🎜>        /// 姓名
            ///
            public String; get get; set;
            ///
            /// 生日
            //    }

        ///


        /// 回學生集合的json字元
        ///

        void ProcessRequest( HttpContext context)
            {

                //設定伺服器回應的結果為純文字格式            List students = new List
                {
                 12")},
    new Student(){Name ="Rose",Birthday =Convert.ToDateTime("2014-01-10 11:12:12")},
               ToDateTime("2014-01-09 10:12:12")}
                };

                //序列化學生集合物件得到json字元
               到客戶端
                context.Response.Write(studentsJson);
                context.Response.End();
            }

            public bool IsReusable
            {
                          return false;            }

          
    運行結果如下:




    這時候的日期格式基本上就正確了,只要在javascript中直接實例化日期就好了,

    var date = new Date("01/31/2014 12:12:12");
    alert(date.toLocaleString());

    客戶端的程式碼如下:


    複製程式碼

    程式碼如下:


    $(function () {
                $.getJSON("GetJson2.ashx", function (students) { (index, obj) {
                        $ ("
  • ").html(obj.Name).appendTo("#ulStudents");
                        var birthday = new Date(obj.Birthday);

       toLocaleString()).appendTo("#ulStudents");
                    });
                });
            });

            var date = new Date("01/31/2014 12:12:12");

            alert(date.toLocaleString());這裡講到了三種解決json中序列化後的日期格式問題,應該還有更好更完善的方法,歡迎您告訴我。因為有很多學生問我所以我寫了這點文字,歡迎批評指正。

  • 範例程式碼下載

    相關標籤:
    來源:php.cn
    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
    熱門教學
    更多>
    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板
    關於我們 免責聲明 Sitemap
    PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!