ASP.NET-JSONHelper操作

來源:互聯網
上載者:User

一、介紹

  JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式,基於JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一個子集

  方法有多種,我這邊用到是DataContractJsonSerializer類,官方解釋:“NET Framework 4 .NET Framework 3.5 Silverlight 將對象序列化為 JavaScript 物件標記法 (JSON),並將 JSON 資料還原序列化為對象”。還增加了DataTable轉換成Json對象的方法。

  其命名空間如下:

 

注意:如果是.NET Framework 3.5 光引用了“System.Runtime.Serialization”了這個還不行。運行時會發現:

 

 

 

所以還要引用下“System.ServiceModel.Web”即可。 .NET Framework 4則在System.Runtime.Serialization下。

二、對JSON資料操作

源碼:

 

using System; 
using System.Data; 
using System.Configuration; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.HtmlControls; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.IO; 
using System.Text; 
using System.Text.RegularExpressions;   
using System.Collections.Generic; 
using System.Runtime.Serialization.Json;
using System.Reflection;
namespace  Test.Utils
{
   public  class JsonHelper
    {
         /// <summary> 
          /// JSON序列化
        /// 將泛型list對象轉換成JSON類型串
        /// <param name="t">對象(實體物件或其他對象)</param>
         /// </summary> 
        public static string JsonSerializer_to_Json<T>(T t) 
         { 

             DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); 

             MemoryStream ms = new MemoryStream(); 

             ser.WriteObject(ms, t); 

             string jsonString = Encoding.UTF8.GetString(ms.ToArray()); 

            ms.Close(); 

             //替換Json的Date字串 

            string p = @"\\/Date\((\d+)\+\d+\)\\/"; 

            MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString); 

            Regex reg = new Regex(p); 

             jsonString = reg.Replace(jsonString, matchEvaluator); 

             return jsonString; 

         } 
         /// <summary> 
         /// JSON還原序列化 
        /// 將JSON類型串轉換成泛型list對象
        /// <param name="jsonString">json格式的字串</param>
       /// </summary> 
         public static T JsonDeserialize_JsonTo<T>(string jsonString) 
         { 
             //將"yyyy-MM-dd HH:mm:ss"格式的字串轉為"\/Date(1294499956278+0800)\/"格式 

             string p = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}"; 

             MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate); 

             Regex reg = new Regex(p); 

            jsonString = reg.Replace(jsonString, matchEvaluator); 

             DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); 

             MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)); 

            T obj = (T)ser.ReadObject(ms); 

            return obj; 
         }  

        /// <summary> 
        /// 將Json序列化的時間由/Date(1294499956278+0800)轉為字串 
       /// </summary> 
         private static string ConvertJsonDateToDateString(Match m) 

         { 

             string result = string.Empty; 

             DateTime dt = new DateTime(1970, 1, 1); 

            dt = dt.AddMilliseconds(long.Parse(m.Groups[1].Value)); 

             dt = dt.ToLocalTime(); 

             result = dt.ToString("yyyy-MM-dd HH:mm:ss"); 

             return result; 

         } 
        /// <summary> 
        /// 將時間字串轉為Json時間 
       /// </summary> 
         private static string ConvertDateStringToJsonDate(Match m) 

         { 

            string result = string.Empty; 

             DateTime dt = DateTime.Parse(m.Groups[0].Value); 

             dt = dt.ToUniversalTime(); 

            TimeSpan ts = dt - DateTime.Parse("1970-01-01"); 

             result = string.Format("\\/Date({0}+0800)\\/", ts.TotalMilliseconds); 

             return result; 

         }
         /// <summary>
         ///  將泛型list對象轉換成JSON類型串(二)
         /// </summary>
         /// <typeparam name="T">物件類型或實體類型</typeparam>
         /// <param name="jsonName">對該對象起名字</param>
         /// <param name="IL">Ilist對象</param>
         /// <returns></returns>
         public static string ObjectToJson<T>(string jsonName, IList<T> IL)
         {
             StringBuilder Json = new StringBuilder();
             Json.Append("{\"" + jsonName + "\":[");
             if (IL.Count > 0)
             {
                 for (int i = 0; i < IL.Count; i++)
                 {
                     T obj = Activator.CreateInstance<T>();
                     Type type = obj.GetType();
                     PropertyInfo[] pis = type.GetProperties();
                     Json.Append("{");
                     for (int j = 0; j < pis.Length; j++)
                     {
                         Json.Append("\"" + pis[j].Name.ToString() + "\":\"" + pis[j].GetValue(IL[i], null) + "\"");
                         if (j < pis.Length - 1)
                         {
                             Json.Append(",");
                         }
                     }
                     Json.Append("}");
                     if (i < IL.Count - 1)
                     {
                         Json.Append(",");
                     }
                 }
             }
             Json.Append("]}");
             return Json.ToString();
         }

         /// <summary>
         /// 將資料錶轉換成JSON類型串
         /// </summary>
         /// <param name="dt">要轉換的資料表</param>
         /// <returns></returns>
         public static StringBuilder DataTableToJSON(System.Data.DataTable dt)
         {
             return DataTableToJSON(dt, true);
         }

         /// <summary>
         /// 將資料錶轉換成JSON類型串
         /// </summary>
         /// <param name="dt">要轉換的資料表</param>
         /// <param name="dispose">資料錶轉換結束後是否dispose掉</param>
         /// <returns></returns>
         public static StringBuilder DataTableToJSON(System.Data.DataTable dt, bool dt_dispose)
         {
             StringBuilder stringBuilder = new StringBuilder();
             stringBuilder.Append("[");

             //資料表欄位名和類型數組
             string[] dt_field = new string[dt.Columns.Count];
             int i = 0;
             string formatStr = "{{";
             string fieldtype = "";
             foreach (System.Data.DataColumn dc in dt.Columns)
             {
                 dt_field[i] = dc.Caption.ToLower().Trim();
                 formatStr += '"' + dc.Caption.ToLower().Trim() + '"' + ":";
                 fieldtype = dc.DataType.ToString().Trim().ToLower();
                 if (fieldtype.IndexOf("int") > 0 || fieldtype.IndexOf("deci") > 0 ||
                     fieldtype.IndexOf("floa") > 0 || fieldtype.IndexOf("doub") > 0 ||
                     fieldtype.IndexOf("bool") > 0)
                 {
                     formatStr += "{" + i + "}";
                 }
                 else
                 {
                     formatStr += '"' + "{" + i + "}" + '"';
                 }
                 formatStr += ",";
                 i++;
             }

             if (formatStr.EndsWith(","))
             {
                 formatStr = formatStr.Substring(0, formatStr.Length - 1);//去掉尾部","號
             }
             formatStr += "}},";

             i = 0;
             object[] objectArray = new object[dt_field.Length];
             foreach (System.Data.DataRow dr in dt.Rows)
             {

                 foreach (string fieldname in dt_field)
                 {   //對 \ , ' 符號進行轉換
                     objectArray[i] = dr[dt_field[i]].ToString().Trim().Replace("\\", "\\\\").Replace("'", "\\'").Replace("\n", "");
                     switch (objectArray[i].ToString())
                     {
                         case "True":
                             {
                                 objectArray[i] = "true"; break;
                             }
                         case "False":
                             {
                                 objectArray[i] = "false"; break;
                             }
                         default: break;
                     }
                     i++;
                 }
                 i = 0;
                 stringBuilder.Append(string.Format(formatStr, objectArray));
             }
             if (stringBuilder.ToString().EndsWith(","))
             {
                 stringBuilder.Remove(stringBuilder.Length - 1, 1);//去掉尾部","號
             }

             if (dt_dispose)
             {
                 dt.Dispose();
             }
             return stringBuilder.Append("]");
         }

         /// <summary>
         /// datatable分頁
         /// </summary>
         /// <param name="dt"></param>
         /// <param name="PageIndex"></param>
         /// <param name="PageSize"></param>
         /// <returns></returns>
         public static DataTable GetPagedTable(DataTable dt, int PageIndex, int PageSize)
         {

             if (PageIndex == 0)
                 return dt;
             DataTable newdt = dt.Clone();

             int rowbegin = (PageIndex - 1) * PageSize;
             int rowend = PageIndex * PageSize;

             if (rowbegin >= dt.Rows.Count)
                 return newdt;

             if (rowend > dt.Rows.Count)
                 rowend = dt.Rows.Count;
             for (int i = rowbegin; i <= rowend - 1; i++)
             {
                 DataRow newdr = newdt.NewRow();
                 DataRow dr = dt.Rows[i];
                 foreach (DataColumn column in dt.Columns)
                 {
                     newdr[column.ColumnName] = dr[column.ColumnName];
                 }
                 newdt.Rows.Add(newdr);
             }

             return newdt;
         }
         /// <summary>
         /// 返回有效名稱
         /// </summary>
         /// <param name="unName"></param>
         /// <param name="unEnName"></param>
         /// <returns></returns>
         public static string GetValidateName(string firName, string secEnName)
         {
             string strName = "";
             if (!String.IsNullOrEmpty(firName))
             {
                 strName = firName;
             }
             else
             {
                 if (!String.IsNullOrEmpty(secEnName))
                 {
                     strName = secEnName;
                 }
             }
             return strName;
         }

    }
}

 

實驗下:

Product

 
1 public
class
Product
2     {
3         publicstringproName {get;set;
}
4         publicdecimal proPrice {get;set;
}
5         publicstringproAttr {get;set;
}
6         publicstringproAddres {get;set;
7     }

操作

1:序列化

 
1 Product pro = newProduct();
2 pro.proAddres = "上海";
3 pro.proAttr = "cpu";
4 pro.proName = "電腦";
5 pro.proPrice = 3680;
6 string
josn = JSONHelper.JsonSerializer<Product>(pro);   
7 //序列化Message.ShowAlert("提示", josn);

2,還原序列化

 
1 string
json =
"{\"proAddres\":\"上海\",\"proAttr\":\"cpu\",\"proName\":\"電腦\",\"proPrice\":3680}";
2 Product pro = JSONHelper.JsonDeserialize<Product>(json);

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.