ASP.NET之JSONHelper操作

来源:互联网 发布:单片机的发展趋势 编辑:程序博客网 时间:2024/04/30 15:04

之前说到了Ext.Net中GridPanel行取值的问题(Ext.Net开发_GridPanel行选中取值),涉及到checkBox操作时,要留个心眼注意下取值的区别!返回值是Json格式。 现在用到了Json,就想自己也整一个Josn帮助类。在线帮助的资料很多,在巨人的身上东凑西凑也凑一个用用。   

 

一、介绍

  JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集

 

  方法有多种,我这边用到是DataContractJsonSerializer类,官方解释:“NET Framework 4 .NET Framework 3.5 Silverlight 将对象序列化为 JavaScript 对象表示法 (JSON),并将 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.Web.Script.Serialization;
using System.Collections.Generic;
using System.Runtime.Serialization.Json;
namespace WebUI.CommonClass
{
public class JSONHelper
{

/// <summary>
/// JSON序列化
/// </summary>
public static string JsonSerializer<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反序列化
/// </summary>
public static T JsonDeserialize<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;
}
}
}
复制代码
复制代码


实验下:

Product

复制代码
复制代码
    public class Product
{
public string proName { get ;set ; }
public decimal proPrice { get; set; }
public string proAttr { get; set; }
public string proAddres { get; set; }
}
复制代码
复制代码

操作

1:序列化

复制代码
复制代码
Product pro = new Product();
pro.proAddres = "上海";
pro.proAttr = "cpu";
pro.proName = "电脑";
pro.proPrice = 3680;
string josn = JSONHelper.JsonSerializer<Product>(pro); //序列化
Message.ShowAlert("提示", josn);
复制代码
复制代码

效果:


2,反序列化

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

 

 


 

 

 

  JSONHELP

  

复制代码
复制代码
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Script.Serialization;using System.Collections;using System.Data;using System.Text;using System.Reflection;using System.Globalization;using System.Text.RegularExpressions;namespace FumaCRM_BS.NewWeb.Common.Class{    public class JsonHelper    {        /// <summary>        /// DataTable转Json        /// </summary>        /// <param name="dtb"></param>        /// <returns></returns>        public static string Dtb2Json(DataTable dtb)        {            JavaScriptSerializer jss = new JavaScriptSerializer();            ArrayList dic = new ArrayList();            foreach (DataRow row in dtb.Rows)            {                Dictionary<string, object> drow = new Dictionary<string, object>();                foreach (DataColumn col in dtb.Columns)                {                    drow.Add(col.ColumnName, row[col.ColumnName]);                }                dic.Add(drow);            }            return jss.Serialize(dic);        }        /// <summary>        /// Json转DataTable        /// </summary>        /// <param name="json"></param>        /// <returns></returns>        public static DataTable Json2Dtb(string json)        {            JavaScriptSerializer jss = new JavaScriptSerializer();            ArrayList dic = jss.Deserialize<ArrayList>(json);            DataTable dtb = new DataTable();            if (dic.Count > 0)            {                foreach (Dictionary<string, object> drow in dic)                {                    if (dtb.Columns.Count == 0)                    {                        foreach (string key in drow.Keys)                        {                            //if (drow[key].GetType() != null)                            //    dtb.Columns.Add(key, drow[key].GetType());                            //else                                dtb.Columns.Add(key);                        }                    }                    DataRow row = dtb.NewRow();                    foreach (string key in drow.Keys)                    {                        row[key] = drow[key];                    }                    dtb.Rows.Add(row);                }            }            return dtb;        }        public static string DataTable2Json(DataTable dt)        {            if (dt == null || dt.Rows.Count == 0)                return "[]";            StringBuilder jsonBuilder = new StringBuilder();            jsonBuilder.Append("[");            for (int i = 0; i < dt.Rows.Count; i++)            {                jsonBuilder.Append("{");                for (int j = 0; j < dt.Columns.Count; j++)                {                    jsonBuilder.Append("\"");                    jsonBuilder.Append(dt.Columns[j].ColumnName);                    jsonBuilder.Append("\":\"");                    string value = dt.Rows[i][j].ToString().Replace("\r", "").Replace("\n", "").Replace("\t", "").Trim();                    if (dt.Columns[j].DataType.FullName == "System.DateTime")                        jsonBuilder.Append(value.Length == 0 ? value : Convert.ToDateTime(value).ToString("yyyy-MM-dd"));                    else                        jsonBuilder.Append(value);                    jsonBuilder.Append("\",");                }                jsonBuilder.Remove(jsonBuilder.Length - 1, 1);                jsonBuilder.Append("},");            }            jsonBuilder.Remove(jsonBuilder.Length - 1, 1);            jsonBuilder.Append("]");            return jsonBuilder.ToString();        }        #region JqueryEasyUI JSON  Method        /// <summary>        /// 生成表单编辑赋值 JSON格式        /// </summary>        /// <param name="dt"></param>        /// <param name="displayCount"></param>        /// <returns></returns>        public static string CreateJsonOne(DataTable dt, bool displayCount)        {            StringBuilder JsonString = new StringBuilder();            //Exception Handling                    if (dt != null && dt.Rows.Count > 0)            {                for (int i = 0; i < dt.Rows.Count; i++)                {                    JsonString.Append("{ ");                    for (int j = 0; j < dt.Columns.Count; j++)                    {                        if (j < dt.Columns.Count - 1)                        {                            JsonString.Append("ipt_" + dt.Columns[j].ColumnName.ToString().ToLower() + ":" + "\"" + dt.Rows[i][j].ToString() + "\",");                        }                        else if (j == dt.Columns.Count - 1)                        {                            JsonString.Append("ipt_" + dt.Columns[j].ColumnName.ToString().ToLower() + ":" + "\"" + dt.Rows[i][j].ToString() + "\"");                        }                    }                    if (i == dt.Rows.Count - 1)                    {                        JsonString.Append("} ");                    }                    else                    {                        JsonString.Append("}, ");                    }                }                return JsonString.ToString();            }            else            {                return null;            }        }        /// <summary>        /// 将DataTable中的数据转换成JSON格式        /// </summary>        /// <param name="dt">数据源DataTable</param>        /// <param name="displayCount">是否输出数据总条数</param>        /// <returns></returns>        public static string CreateJsonParameters(DataTable dt, bool displayCount)        {            return CreateJsonParameters(dt, displayCount, dt.Rows.Count);        }        /// <summary>        /// 将DataTable中的数据转换成JSON格式        /// </summary>        /// <param name="dt">数据源DataTable</param>        /// <returns></returns>        public static string CreateJsonParameters(DataTable dt)        {            return CreateJsonParameters(dt, true);        }        /// <summary>        /// 将DataTable中的数据转换成JSON格式        /// </summary>        /// <param name="dt">数据源DataTable</param>        /// <param name="displayCount">是否输出数据总条数</param>        /// <param name="totalcount">JSON中显示的数据总条数</param>        /// <returns></returns>        public static string CreateJsonParameters(DataTable dt, bool displayCount, int totalcount)        {            StringBuilder JsonString = new StringBuilder();            //Exception Handling                    if (dt != null)            {                JsonString.Append("{ ");                JsonString.Append("\"rows\":[ ");                for (int i = 0; i < dt.Rows.Count; i++)                {                    JsonString.Append("{ ");                    for (int j = 0; j < dt.Columns.Count; j++)                    {                        if (j < dt.Columns.Count - 1)                        {                            //if (dt.Rows[i][j] == DBNull.Value) continue;                            if (dt.Columns[j].DataType == typeof(bool))                            {                                JsonString.Append("\"JSON_" + dt.Columns[j].ColumnName.ToLower() + "\":" +                                                  dt.Rows[i][j].ToString().ToLower() + ",");                            }                            else if (dt.Columns[j].DataType == typeof(string))                            {                                JsonString.Append("\"JSON_" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" +                                                  dt.Rows[i][j].ToString().Replace("\"", "\\\"") + "\",");                            }                            else                            {                                JsonString.Append("\"JSON_" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + dt.Rows[i][j] + "\",");                            }                        }                        else if (j == dt.Columns.Count - 1)                        {                            //if (dt.Rows[i][j] == DBNull.Value) continue;                            if (dt.Columns[j].DataType == typeof(bool))                            {                                JsonString.Append("\"JSON_" + dt.Columns[j].ColumnName.ToLower() + "\":" +                                                  dt.Rows[i][j].ToString().ToLower());                            }                            else if (dt.Columns[j].DataType == typeof(string))                            {                                JsonString.Append("\"JSON_" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" +                                                  dt.Rows[i][j].ToString().Replace("\"", "\\\"") + "\"");                            }                            else                            {                                JsonString.Append("\"JSON_" + dt.Columns[j].ColumnName.ToLower() + "\":" + "\"" + dt.Rows[i][j] + "\"");                            }                        }                    }                    /*end Of String*/                    if (i == dt.Rows.Count - 1)                    {                        JsonString.Append("} ");                    }                    else                    {                        JsonString.Append("}, ");                    }                }                JsonString.Append("]");                if (displayCount)                {                    JsonString.Append(",");                    JsonString.Append("\"total\":");                    JsonString.Append(totalcount);                }                JsonString.Append("}");                return JsonString.ToString().Replace("\n", "");            }            else            {                return null;            }        }        #region object 2 json        private static void WriteDataRow(StringBuilder sb, DataRow row)        {            sb.Append("{");            foreach (DataColumn column in row.Table.Columns)            {                sb.AppendFormat("\"{0}\":", column.ColumnName);                WriteValue(sb, row[column]);                sb.Append(",");            }            // Remove the trailing comma.            if (row.Table.Columns.Count > 0)            {                --sb.Length;            }            sb.Append("}");        }        private static void WriteDataSet(StringBuilder sb, DataSet ds)        {            sb.Append("{\"Tables\":{");            foreach (DataTable table in ds.Tables)            {                sb.AppendFormat("\"{0}\":", table.TableName);                WriteDataTable(sb, table);                sb.Append(",");            }            // Remove the trailing comma.            if (ds.Tables.Count > 0)            {                --sb.Length;            }            sb.Append("}}");        }        private static void WriteDataTable(StringBuilder sb, DataTable table)        {            sb.Append("{\"Rows\":[");            foreach (DataRow row in table.Rows)            {                WriteDataRow(sb, row);                sb.Append(",");            }            // Remove the trailing comma.            if (table.Rows.Count > 0)            {                --sb.Length;            }            sb.Append("]}");        }        private static void WriteEnumerable(StringBuilder sb, IEnumerable e)        {            bool hasItems = false;            sb.Append("[");            foreach (object val in e)            {                WriteValue(sb, val);                sb.Append(",");                hasItems = true;            }            // Remove the trailing comma.            if (hasItems)            {                --sb.Length;            }            sb.Append("]");        }        private static void WriteHashtable(StringBuilder sb, IDictionary e)        {            bool hasItems = false;            sb.Append("{");            foreach (string key in e.Keys)            {                sb.AppendFormat("\"{0}\":", key.ToLower());                WriteValue(sb, e[key]);                sb.Append(",");                hasItems = true;            }            // Remove the trailing comma.            if (hasItems)            {                --sb.Length;            }            sb.Append("}");        }        private static void WriteObject(StringBuilder sb, object o)        {            MemberInfo[] members = o.GetType().GetMembers(BindingFlags.Instance | BindingFlags.Public);            sb.Append("{");            bool hasMembers = false;            foreach (MemberInfo member in members)            {                bool hasValue = false;                object val = null;                if ((member.MemberType & MemberTypes.Field) == MemberTypes.Field)                {                    FieldInfo field = (FieldInfo)member;                    val = field.GetValue(o);                    hasValue = true;                }                else if ((member.MemberType & MemberTypes.Property) == MemberTypes.Property)                {                    PropertyInfo property = (PropertyInfo)member;                    if (property.CanRead && property.GetIndexParameters().Length == 0)                    {                        val = property.GetValue(o, null);                        hasValue = true;                    }                }                if (hasValue)                {                    sb.Append("\"");                    sb.Append(member.Name);                    sb.Append("\":");                    WriteValue(sb, val);                    sb.Append(",");                    hasMembers = true;                }            }            if (hasMembers)            {                --sb.Length;            }            sb.Append("}");        }        private static void WriteString(StringBuilder sb, IEnumerable s)        {            sb.Append("\"");            foreach (char c in s)            {                switch (c)                {                    case '\"':                        sb.Append("\\\"");                        break;                    case '\\':                        sb.Append("\\\\");                        break;                    case '\b':                        sb.Append("\\b");                        break;                    case '\f':                        sb.Append("\\f");                        break;                    case '\n':                        sb.Append("\\n");                        break;                    case '\r':                        sb.Append("\\r");                        break;                    case '\t':                        sb.Append("\\t");                        break;                    default:                        int i = c;                        if (i < 32 || i > 127)                        {                            sb.AppendFormat("\\u{0:X04}", i);                        }                        else                        {                            sb.Append(c);                        }                        break;                }            }            sb.Append("\"");        }        public static void WriteValue(StringBuilder sb, object val)        {            if (val == null || val == DBNull.Value)            {                sb.Append("null");            }            else if (val is string || val is Guid)            {                WriteString(sb, val.ToString());            }            else if (val is bool)            {                sb.Append(val.ToString().ToLower());            }            else if (val is double ||                     val is float ||                     val is long ||                     val is int ||                     val is short ||                     val is byte ||                     val is decimal)            {                sb.AppendFormat(CultureInfo.InvariantCulture.NumberFormat, "{0}", val);            }            else if (val.GetType().IsEnum)            {                sb.Append((int)val);            }            else if (val is DateTime)            {                sb.Append("new Date(\"");                sb.Append(((DateTime)val).ToString("MMMM, d yyyy HH:mm:ss",                                                    new CultureInfo("en-US", false).DateTimeFormat));                sb.Append("\")");            }            else if (val is DataSet)            {                WriteDataSet(sb, val as DataSet);            }            else if (val is DataTable)            {                WriteDataTable(sb, val as DataTable);            }            else if (val is DataRow)            {                WriteDataRow(sb, val as DataRow);            }            else if (val is Hashtable)            {                WriteHashtable(sb, val as Hashtable);            }            else if (val is IEnumerable)            {                WriteEnumerable(sb, val as IEnumerable);            }            else            {                WriteObject(sb, val);            }        }        /// <summary>        ///         /// </summary>        /// <param name="o"></param>        /// <returns></returns>        public static string Convert2Json(object o)        {            StringBuilder sb = new StringBuilder();            WriteValue(sb, o);            return sb.ToString();        }        #endregion        #endregion        /// <summary>        /// 转换对象为JSON格式数据        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="obj">对象</param>        /// <returns>字符格式的JSON数据</returns>        public static string GetJSON<T>(object obj)        {            string result = String.Empty;            try            {                System.Runtime.Serialization.Json.DataContractJsonSerializer serializer =                new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(T));                using (System.IO.MemoryStream ms = new System.IO.MemoryStream())                {                    serializer.WriteObject(ms, obj);                    result = System.Text.Encoding.UTF8.GetString(ms.ToArray());                }            }            catch (Exception ex)            {                throw ex;            }            return result;        }        /// <summary>        /// 转换List<T>的数据为JSON格式        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="vals">列表值</param>        /// <returns>JSON格式数据</returns>        public static string JSON<T>(List<T> vals)        {            System.Text.StringBuilder st = new System.Text.StringBuilder();            try            {                System.Runtime.Serialization.Json.DataContractJsonSerializer s = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(T));                foreach (T city in vals)                {                    using (System.IO.MemoryStream ms = new System.IO.MemoryStream())                    {                        s.WriteObject(ms, city);                        st.Append(System.Text.Encoding.UTF8.GetString(ms.ToArray()));                    }                }            }            catch (Exception ex)            {                throw ex;            }            return st.ToString();        }        /// <summary>        /// JSON格式字符转换为T类型的对象        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="jsonStr"></param>        /// <returns></returns>        public static T ParseFormByJson<T>(string jsonStr)        {            T obj = Activator.CreateInstance<T>();            using (System.IO.MemoryStream ms =            new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(jsonStr)))            {                System.Runtime.Serialization.Json.DataContractJsonSerializer serializer =                new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(T));                return (T)serializer.ReadObject(ms);            }        }        /// <summary>        /// 将获取的Json数据转换为DataTable        /// </summary>        /// <param name="strJson">Json字符串</param>        /// <returns></returns>        public static DataTable JsonToDataTable(string strJson)        {            //取出表名               var rg = new Regex(@"(?<={)[^:]+(?=:\[)", RegexOptions.IgnoreCase);            string strName = rg.Match(strJson).Value;            DataTable tb = null;            //去除表名               strJson = strJson.Substring(strJson.IndexOf("[") + 1);            strJson = strJson.Substring(0, strJson.IndexOf("]"));            //获取数据               rg = new Regex(@"(?<={)[^}]+(?=})");            MatchCollection mc = rg.Matches(strJson);            for (int i = 0; i < mc.Count; i++)            {                string strRow = mc[i].Value;                string[] strRows = strRow.Split(',');                //创建表                   if (tb == null)                {                    tb = new DataTable();                    tb.TableName = strName;                    foreach (string str in strRows)                    {                        var dc = new DataColumn();                        string[] strCell = str.Split(':');                        dc.ColumnName = strCell[0].Replace("\"", "");// strCell[0];                        tb.Columns.Add(dc);                    }                    tb.AcceptChanges();                }                //增加内容                   DataRow dr = tb.NewRow();                for (int r = 0; r < strRows.Length; r++)                {                    dr[r] = strRows[r].Split(':')[1].Trim().Replace("", ",").Replace("", ":").Replace("\"", "");                }                tb.Rows.Add(dr);                tb.AcceptChanges();            }            return tb;        }        /// <summary>        ///         /// </summary>        /// <param name="strJson"></param>        /// <param name="symbol"></param>        /// <returns></returns>        public static DataTable JsonToDataTable(string strJson, string symbol)        {            //取出表名               var rg = new Regex(@"(?<={)[^:]+(?=:\[)", RegexOptions.IgnoreCase);            string strName = rg.Match(strJson).Value;            DataTable tb = null;            //去除表名               strJson = strJson.Substring(strJson.IndexOf("[") + 1);            strJson = strJson.Substring(0, strJson.IndexOf("]"));            //获取数据               rg = new Regex(@"(?<={)[^}]+(?=})");            MatchCollection mc = rg.Matches(strJson);            for (int i = 0; i < mc.Count; i++)            {                string strRow = mc[i].Value;                string[] strRows = strRow.Replace(symbol, "|").Split('|');// (symbol);                //创建表                   if (tb == null)                {                    tb = new DataTable();                    tb.TableName = strName;                    foreach (string str in strRows)                    {                        var dc = new DataColumn();                        string[] strCell = str.Split(':');                        dc.ColumnName = strCell[0].Replace("\"", "");// strCell[0];                        tb.Columns.Add(dc);                    }                    tb.AcceptChanges();                }                //增加内容                   DataRow dr = tb.NewRow();                for (int r = 0; r < strRows.Length; r++)                {                    dr[r] = strRows[r].Split(':')[1].Trim().Replace("", ",").Replace("", ":").Replace("\"", "");                }                tb.Rows.Add(dr);                tb.AcceptChanges();            }            return tb;        }        /// <summary>             /// dataTable转换成Json格式             /// </summary>             /// <param name="dt"></param>             /// <returns></returns>             public static string ToJson(DataTable dt)        {            StringBuilder jsonBuilder = new StringBuilder();            jsonBuilder.Append("{\"");            jsonBuilder.Append(dt.TableName);            jsonBuilder.Append("\":[");            for (int i = 0; i < dt.Rows.Count; i++)            {                jsonBuilder.Append("{");                for (int j = 0; j < dt.Columns.Count; j++)                {                    jsonBuilder.Append("\"");                    jsonBuilder.Append(dt.Columns[j].ColumnName);                    jsonBuilder.Append("\":\"");                    jsonBuilder.Append(dt.Rows[i][j].ToString());                    jsonBuilder.Append("\",");                }                jsonBuilder.Remove(jsonBuilder.Length - 1, 1);                jsonBuilder.Append("},");            }            jsonBuilder.Remove(jsonBuilder.Length - 1, 1);            jsonBuilder.Append("]");            jsonBuilder.Append("}");            return jsonBuilder.ToString();        }    }}
复制代码
0 0
原创粉丝点击