JSON 序列化和反序列化:將時間由"//Date(10000000000-0700)//" 格式轉換成 "yyyy-MM-dd HH:mm:ss" 格式的字符串

using System;
using System.Collections;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization;//需要添加對該程序集的引用,才能使用DataContract,DataMember.
using System.Runtime.Serialization.Json;
using System.Text.RegularExpressions;
using System.ServiceModel;//.Web;//需要添加對該程序集的引用才能引用System.Runtime.Serialize.Json;


    /// <summary>
    /// Json數據轉換封裝
    /// </summary>
    public static class JSONHelper
    {
        /// <summary>
        /// 將時間由"//Date(10000000000-0700)//" 格式轉換成 "yyyy-MM-dd HH:mm:ss" 格式的字符串
        /// </summary>
        /// <param name="m"></param>
        /// <returns></returns>
        private static string GetDatetimeString(Match m)
        {
            string sRet = "";
            try
            {
                System.DateTime dt = new DateTime(1970, 1, 1);
                dt = dt.AddMilliseconds(long.Parse(m.Groups[1].Value));
                dt = dt.ToLocalTime();
                sRet = dt.ToString("yyyy-MM-dd HH:mm:ss");
            }
            catch
            { }

            return sRet;
        }

        /// <summary>
        /// 將時間由 "yyyy-MM-dd HH:mm:ss" 格式的字符串轉換成"//Date(10000000000-0700)//" 格式
        /// </summary>
        /// <param name="m"></param>
        /// <returns></returns>
        private static string GetDatetimeJson(Match m)
        {
            String sRet = "";
            try
            {
                DateTime dt = DateTime.Parse(m.Groups[1].Value);
                dt = dt.ToUniversalTime();
                TimeSpan ts = dt - DateTime.Parse("1970-01-01");
                sRet = string.Format("///Date({0}-0700)///", ts.TotalMilliseconds);
            }
            catch
            { }
            return sRet;
        }

        /// <summary>
        /// 擴展Object 方法 ToJson
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static String ToJson(this object obj)
        {
            DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(obj.GetType());
            MemoryStream ms = new MemoryStream();
            jsonSerializer.WriteObject(ms, obj);

            String sRet = Encoding.UTF8.GetString(ms.ToArray());
            ms.Close();

            //將時間由"//Date(10000000000-0700)//" 格式轉換成 "yyyy-MM-dd HH:mm:ss" 格式的字符串
            string sPattern = @"///Date/((/d+)/+/d+/)///";
            MatchEvaluator myMatchEvaluator = new MatchEvaluator(GetDatetimeString);
            Regex reg = new Regex(sPattern);
            sRet = reg.Replace(sRet, myMatchEvaluator);

            return sRet;
        }

        /// <summary>
        /// Jason deSerialize
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sJason"></param>
        /// <returns></returns>
        public static T FromJson<T>(String sJasonData)
        {
            //將時間由 "yyyy-MM-dd HH:mm:ss" 格式的字符串轉換成"//Date(10000000000-0700)//" 格式
            string sPattern = @"(/d{4}-/d{2}-/d{2}/s/d{2}:/d{2}:/d{2})";
            MatchEvaluator myMatchEvaluator = new MatchEvaluator(GetDatetimeJson);
            Regex reg = new Regex(sPattern);
            string src = reg.Replace(sJasonData, myMatchEvaluator);

            DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(T));
            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(src));
            object obj = jsonSerializer.ReadObject(ms);

            return (T)obj;
        }

        public static string Serialize<T>(T obj)//序列化爲JSON
        {
            System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType());
            MemoryStream ms = new MemoryStream();
            serializer.WriteObject(ms, obj);
            string retVal = Encoding.Default.GetString(ms.ToArray());

            //將時間由"//Date(10000000000-0700)//" 格式轉換成 "yyyy-MM-dd HH:mm:ss" 格式的字符串
            string sPattern = @"///Date/((/d+)/+/d+/)///";
            MatchEvaluator myMatchEvaluator = new MatchEvaluator(GetDatetimeString);
            Regex reg = new Regex(sPattern);
            string result = reg.Replace(retVal, myMatchEvaluator);
            //string result = Regex.Replace(retVal, sPattern, new MatchEvaluator(JSONHelper.GetDatetimeString));
            return result;
        }

        public static T Deserialize<T>(string json)//反序列化爲對象
        {
            //將時間由 "yyyy-MM-dd HH:mm:ss" 格式的字符串轉換成"//Date(10000000000-0700)//" 格式
            string sPattern = @"(/d{4}-/d{2}-/d{2}/s/d{2}:/d{2}:/d{2})";
            MatchEvaluator myMatchEvaluator = new MatchEvaluator(GetDatetimeJson);
            Regex reg = new Regex(sPattern);
            string src = reg.Replace(json, myMatchEvaluator);

            T obj = Activator.CreateInstance<T>();
            MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(src));
            System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType());
            obj = (T)serializer.ReadObject(ms);
            ms.Close();
            return obj;
        }
    }

 

發佈了31 篇原創文章 · 獲贊 3 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章