分享一个C#通用的json操作类

来源:互联网 发布:游戏王卡组攻略软件 编辑:程序博客网 时间:2024/06/10 01:54

json操作类,支持json格式的字符串常用操作,对象序列化为json字符串、json字符串转换为对象,DataTable转换为json字符串。支持将实体类转换成DataTable 。

源码如下:

using System;using System.Data;using System.Configuration;using System.Linq;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.Xml.Linq;using System.Web.Script.Serialization;using System.Collections.Generic;using System.Text;using System.Collections;using System.Reflection;using System.IO;/// <summary>///JsonTableHelper 的摘要说明/// </summary>public static class JsonTableHelper{    /// <summary>     /// 返回对象序列化     /// </summary>     /// <param name="obj">源对象</param>     /// <returns>json数据</returns>     public static string ToJson(this object obj)    {        JavaScriptSerializer serialize = new JavaScriptSerializer();        return serialize.Serialize(obj);    }    /// <summary>     /// 控制深度     /// </summary>     /// <param name="obj">源对象</param>     /// <param name="recursionDepth">深度</param>     /// <returns>json数据</returns>     public static string ToJson(this object obj, int recursionDepth)    {        JavaScriptSerializer serialize = new JavaScriptSerializer();        serialize.RecursionLimit = recursionDepth;        return serialize.Serialize(obj);    }    /// <summary>     /// DataTable转为json     /// </summary>     /// <param name="dt">DataTable</param>     /// <returns>json数据</returns>     public static string ToJson(DataTable dt)    {        StringBuilder jsonString = new StringBuilder();        jsonString.Append("[");        DataRowCollection drc = dt.Rows;        for (int i = 0; i < drc.Count; i++)        {            jsonString.Append("{");            for (int j = 0; j < dt.Columns.Count; j++)            {                string strKey = dt.Columns[j].ColumnName;                string strValue = drc[i][j].ToString();                Type type = dt.Columns[j].DataType;                jsonString.Append("\"" + strKey + "\":");                strValue = StringFormat(strValue, type);                if (j < dt.Columns.Count - 1)                {                    jsonString.Append(strValue + ",");                }                else                {                    jsonString.Append(strValue);                }            }            jsonString.Append("},");        }        jsonString.Remove(jsonString.Length - 1, 1);        jsonString.Append("]");        return jsonString.ToString();    }    /// <summary>        /// 格式化字符型、日期型、布尔型        /// </summary>        /// <param name="str"></param>        /// <param name="type"></param>        /// <returns></returns>        private static string StringFormat(string str, Type type)    {        if (str== null || str == string.Empty)            str = "\"\"";        if (type == typeof(string))        {            str = String2Json(str);            str = "\"" + str + "\"";        }        else if (type == typeof(DateTime))        {            str = "\"" + str + "\"";        }        else if (type == typeof(bool))        {            str = str.ToLower();        }        return str;    }    /// <summary>     /// DataTable转为json,不带索引     /// </summary>     /// <param name="dt">DataTable</param>     /// <returns>json数据</returns>     public static string ToJsonTotal(DataTable dt,int count)    {               StringBuilder sb = new StringBuilder();        sb.Append("{\"total\":"+count+",\"rows\":");        sb.Append(ToJsonp(dt));        sb.Append("}");        return sb.ToString();    }    /// <summary>        /// 过滤特殊字符        /// </summary>        /// <param name="s"></param>        /// <returns></returns>        private static string String2Json(String s)    {        StringBuilder sb = new StringBuilder();        for (int i = 0; i < s.Length; i++)        {            char c = s.ToCharArray()[i];            switch (c)            {                case '\"':                    sb.Append("\\\""); break;                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:                    sb.Append(c); break;            }        }        return sb.ToString();    }    /// <summary>     /// DataTable转为json     /// </summary>     /// <param name="dt">DataTable</param>     /// <returns>json数据</returns>     public static string ToJsonDrv(DataTable dt)    {        Dictionary<string, object> dic = new Dictionary<string, object>();        int index = 0;        foreach (DataRowView drv in dt.DefaultView)        {            Dictionary<string, object> result = new Dictionary<string, object>();            foreach (DataColumn dc in dt.Columns)            {                result.Add(dc.ColumnName, drv[dc.ColumnName].ToString());            }            dic.Add(index.ToString(), result);            index++;        }        return ToJson(dic);    }    /// <summary>     /// DataTable转为jsonp,autocomplete插件需要使用的jsonp格式     /// </summary>     /// <param name="dtResult">DataTable</param>     /// <returns>jsonp数据</returns>     public static string ToJsonp(DataTable dtResult)    {        if (dtResult == null)        {            return "";        }        StringBuilder jsonString = new StringBuilder();        string temp = "";        string value = "";        jsonString.Append("[");        foreach (DataRow dr in dtResult.Rows)        {            temp = "";            jsonString.Append("{");            foreach (DataColumn dc in dtResult.Columns)            {                value = dr[dc].ToString();                //if (value.Length < 1)                //{                //    value = " ";                //}                temp += "\"" + dc.ColumnName + "\":\"" + value + "\",";            }            temp = temp.TrimEnd(',');            jsonString.Append(temp + "},");        }        temp = jsonString.ToString();        temp = temp.TrimEnd(',');        temp += "]";        return temp;    }    /// <summary>     /// 将实体类转换成DataTable     /// </summary>     /// <typeparam name="T"></typeparam>     /// <param name="i_objlist"></param>     /// <returns></returns>     public static DataTable ToDataTable<T>(IList<T> objlist)    {        if (objlist == null || objlist.Count <= 0)        {            return null;        }        DataTable dt = new DataTable(typeof(T).Name);        DataColumn column;        DataRow row;        System.Reflection.PropertyInfo[] myPropertyInfo = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);        foreach (T t in objlist)        {            if (t == null)            {                continue;            }            row = dt.NewRow();            for (int i = 0, j = myPropertyInfo.Length; i < j; i++)            {                System.Reflection.PropertyInfo pi = myPropertyInfo[i];                string name = pi.Name;                if (dt.Columns[name] == null)                {                    column = new DataColumn(name, pi.PropertyType);                    dt.Columns.Add(column);                }                row[name] = pi.GetValue(t, null);            }            dt.Rows.Add(row);        }        return dt;    }    public static string Obj2Base64String(object serializableObject)    {        string returnedData;        if (serializableObject == null)            returnedData = String.Empty;        else        {            byte[] resultBytes = null;            System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter                     = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();            MemoryStream stream = new MemoryStream();            formatter.Serialize(stream, serializableObject);            resultBytes = stream.ToArray();            stream.Close();            returnedData = Convert.ToBase64String(resultBytes);        }        return returnedData;    }    ///<summary></summary> <summary><summary></summary>      /// Deserializes base64 string to object.返序列化string 为 object       /// </summary><summary></summary>        public static object Base64String2Obj(string deserializedString)    {        object returnedData;        if (deserializedString == String.Empty)            returnedData = null;        else        {            System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter                   = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();            MemoryStream stream = new MemoryStream();            byte[] middata = Convert.FromBase64String(deserializedString);            stream.Write(middata, 0, middata.Length);            //Pay attention to the following line. don't forget this line.                stream.Seek(0, SeekOrigin.Begin);            returnedData = formatter.Deserialize(stream);            stream.Close();        }        return returnedData;    }    /// <summary>    /// Json 字符串 转换为 DataTable数据集合    /// </summary>    /// <param name="json"></param>    /// <returns></returns>    public static DataTable ToDataTable(this string json)    {        DataTable dataTable = new DataTable();  //实例化        DataTable result;        try        {            JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();            javaScriptSerializer.MaxJsonLength = Int32.MaxValue; //取得最大数值            ArrayList arrayList = javaScriptSerializer.Deserialize<ArrayList>(json);            if (arrayList.Count > 0)            {                foreach (Dictionary<string, object> dictionary in arrayList)                {                    if (dictionary.Keys.Count<string>() == 0)                    {                        result = dataTable;                        return result;                    }                    if (dataTable.Columns.Count == 0)                    {                        foreach (string current in dictionary.Keys)                        {                            dataTable.Columns.Add(current, dictionary[current].GetType());                        }                    }                    DataRow dataRow = dataTable.NewRow();                    foreach (string current in dictionary.Keys)                    {                        dataRow[current] = dictionary[current];                    }                    dataTable.Rows.Add(dataRow); //循环添加行到DataTable中                }            }        }        catch        {        }        result = dataTable;        return result;    }}using System;using System.Collections.Generic;using System.Web;using System.Web.Script.Serialization;using System.Data;namespace cn.EginSoft.Core.Commons{    /// <summary>     /// JSON帮助类     /// </summary>     public class JsonHelper    {        /// <summary>         /// 对象转JSON         /// </summary>         /// <param name="obj">对象</param>         /// <returns>JSON格式的字符串</returns>         public static string ObjectToJSON(object obj)        {            JavaScriptSerializer jss = new JavaScriptSerializer();            try            {                return jss.Serialize(obj);            }            catch (Exception ex)            {                throw new Exception("JSONHelper.ObjectToJSON(): " + ex.Message);            }        }        /// <summary>         /// 数据表转键值对集合         /// 把DataTable转成 List集合, 存每一行         /// 集合中放的是键值对字典,存每一列         /// </summary>         /// <param name="dt">数据表</param>         /// <returns>哈希表数组</returns>         public static List<Dictionary<string, object>> DataTableToList(DataTable dt)        {            List<Dictionary<string, object>> list            = new List<Dictionary<string, object>>();            foreach (DataRow dr in dt.Rows)            {                Dictionary<string, object> dic = new Dictionary<string, object>();                foreach (DataColumn dc in dt.Columns)                {                    dic.Add(dc.ColumnName, dr[dc.ColumnName]);                }                list.Add(dic);            }            return list;        }        /// <summary>         /// 数据集转键值对数组字典         /// </summary>         /// <param name="dataSet">数据集</param>         /// <returns>键值对数组字典</returns>         public static Dictionary<string, List<Dictionary<string, object>>> DataSetToDic(DataSet ds)        {            Dictionary<string, List<Dictionary<string, object>>> result = new Dictionary<string, List<Dictionary<string, object>>>();            foreach (DataTable dt in ds.Tables)                result.Add(dt.TableName, DataTableToList(dt));            return result;        }        /// <summary>         /// 数据表转JSON         /// </summary>         /// <param name="dataTable">数据表</param>         /// <returns>JSON字符串</returns>         public static string DataTableToJSON(DataTable dt)        {            return ObjectToJSON(DataTableToList(dt));        }        /// <summary>         /// JSON文本转对象,泛型方法         /// </summary>         /// <typeparam name="T">类型</typeparam>         /// <param name="jsonText">JSON文本</param>         /// <returns>指定类型的对象</returns>         public static T JSONToObject<T>(string jsonText)        {            JavaScriptSerializer jss = new JavaScriptSerializer();            try            {                return jss.Deserialize<T>(jsonText);            }            catch (Exception ex)            {                throw new Exception("JSONHelper.JSONToObject(): " + ex.Message);            }        }        /// <summary>         /// 将JSON文本转换为数据表数据         /// </summary>         /// <param name="jsonText">JSON文本</param>         /// <returns>数据表字典</returns>         public static Dictionary<string, List<Dictionary<string, object>>> TablesDataFromJSON(string jsonText)        {            return JSONToObject<Dictionary<string, List<Dictionary<string, object>>>>(jsonText);        }        /// <summary>         /// 将JSON文本转换成数据行         /// </summary>         /// <param name="jsonText">JSON文本</param>         /// <returns>数据行的字典</returns>         public static Dictionary<string, object> DataRowFromJSON(string jsonText)        {            return JSONToObject<Dictionary<string, object>>(jsonText);        }    }}


0 0