对象和集合与Json之间的转换,DataTable和DataSet转换为Json

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Collections;
using System.Reflection;

namespace Common
{
    public class ConvertHelper
    {
        #region DataTable转换为List

        /// <summary>       
        /// 利用反射和泛型       
        /// </summary>       
        /// <param name="dt"></param>       
        /// <returns></returns>       
        public static List<T> ConvertToList<T>(DataTable dt)
        {
            // 定义集合          
            List<T> list = new List<T>();
            // 获得此模型的类型           
            Type type = typeof(T);
            //定义一个临时变量           
            string tempName = string.Empty;
            //遍历DataTable中所有的数据行          
            foreach (DataRow dr in dt.Rows)
            {
                T t = Activator.CreateInstance<T>();
               
                // 获得此模型的公共属性           
                PropertyInfo[] propertys = t.GetType().GetProperties();
                //遍历该对象的所有属性               
                foreach (PropertyInfo pi in propertys)
                {
                    tempName = pi.Name;//将属性名称赋值给临时变量          
                    //检查DataTable是否包含此列(列名==对象的属性名)            
                    if (dt.Columns.Contains(tempName))
                    {
                        // 判断此属性是否有Setter     
                        if (!pi.CanWrite) continue;//该属性不可写,直接跳出       
                        //取值                   
                        object value = dr[tempName];
                        //如果非空,则赋给对象的属性     

                        if (value != DBNull.Value)
                        {
                            switch (pi.PropertyType.Name)
                            {
                                case "Int16":
                                    pi.SetValue(t, Convert.ToInt16(value), null);
                                    break;
                                case "Int32":
                                    pi.SetValue(t, Convert.ToInt32(value), null);
                                    break;
                                case "Int64":
                                    pi.SetValue(t, Convert.ToInt64(value), null);
                                    break;
                                case "String":
                                    pi.SetValue(t, value.ToString(), null);
                                    break;
                                case "Decimal":
                                    pi.SetValue(t, Convert.ToDecimal(value), null);
                                    break;
                                case "Double":
                                    pi.SetValue(t, Convert.ToDecimal(value), null);
                                    break;
                                case "Boolean":
                                    pi.SetValue(t, Convert.ToBoolean(value), null);
                                    break;
                                case "DateTime":
                                    pi.SetValue(t, Convert.ToDateTime(value), null);
                                    break;
                                case "Char":
                                    pi.SetValue(t, Convert.ToChar(value), null);
                                    break;
                                case "Byte":
                                    pi.SetValue(t, Convert.ToByte(value), null);
                                    break;
                            }
                        }
                    }
                }
                //对象添加到泛型集合中            
                list.Add(t);
            }
            return list;
        }

        #endregion

        #region 转换为Json

        /// <summary>       
        /// 单个对象转化为Json
        /// </summary>       
        /// <param name="dt"></param>       
        /// <returns></returns>       
        public static string ConvertToJson<T>(T t, string jsonName)
        {
            StringBuilder Json = new StringBuilder();

            if (string.IsNullOrEmpty(jsonName))
            {
                jsonName = t.GetType().Name;
            }
            Json.Append("{\"" + jsonName + "\":[");

            T obj = Activator.CreateInstance<T>();
            PropertyInfo[] pi = obj.GetType().GetProperties();
            Json.Append("{");
            for (int j = 0; j < pi.Length; j++)
            {
                Type type = pi[j].GetValue(t, null).GetType();
                Json.Append("\"" + pi[j].Name.ToString() + "\":" + string.Format(pi[j].GetValue(t, null).ToString(), type));
                if (j < pi.Length - 1)
                {
                    Json.Append(",");
                }
            }
            Json.Append("}]}");

            return Json.ToString();
        }

        /// <summary>
        /// 实体集合转换为Json
        /// </summary>
        /// <param name="list"></param>
        /// <param name="jsonName"></param>
        /// <returns></returns>    
        public static string ConvertToJson<T>(List<T> list, string jsonName)
        {
            StringBuilder Json = new StringBuilder();

            if (string.IsNullOrEmpty(jsonName))
            {
                jsonName = list[0].GetType().Name;
            }
            Json.Append("{\"" + jsonName + "\":[");
            if (list != null && list.Count > 0)
            {
                for (int i = 0; i < list.Count; i++)
                {
                    T obj = Activator.CreateInstance<T>();
                    PropertyInfo[] pi = obj.GetType().GetProperties();
                    Json.Append("{");
                    for (int j = 0; j < pi.Length; j++)
                    {
                        Type type = pi[j].GetValue(list[i], null).GetType();
                        Json.Append("\"" + pi[j].Name.ToString() + "\":" + string.Format(pi[j].GetValue(list[i], null).ToString(), type));
                        if (j < pi.Length - 1)
                        {
                            Json.Append(",");
                        }
                    }
                    Json.Append("}");
                    if (i < list.Count - 1)
                    {
                        Json.Append(",");
                    }
                }
            }
            Json.Append("]}");
            return Json.ToString();
        }

        /// <summary>
        /// DataTable转换为Json
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static string ConvertToJson(DataTable dt)
        {
            StringBuilder jsonBuilder = new StringBuilder();
            jsonBuilder.Append("{\"");
            jsonBuilder.Append(dt.TableName.ToString());
            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();
        }

        /// <summary>
        /// DataSet转换为Json
        /// </summary>
        /// <param name="ds"></param>
        /// <returns></returns>
        public static string ConvertToJson(DataSet ds)
        {
            StringBuilder jsonBuilder = new StringBuilder();
            jsonBuilder.Append("{");
            foreach (DataTable dt in ds.Tables)
            {
                jsonBuilder.Append("\"");
                jsonBuilder.Append(dt.TableName.ToString());
                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.Remove(jsonBuilder.Length - 1, 1);
            jsonBuilder.Append("}");
            return jsonBuilder.ToString();
        }

        #endregion

        #region Json数据转换为泛型集合(或实体)

        /// <summary>
        /// 单条json数据转换为实体
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="str">字符窜(格式为{"Name":[{"a":,"b":},{"a":,"b":},{"a":,"b":}]})</param>
        /// <returns></returns>
        public static T ConvertToEntity<T>(string jsonArr)
        {
            string strJson = jsonArr.Trim('{').Trim('}');
            strJson = strJson.Substring(strJson.IndexOf(":") + 1);
            string recive = strJson.Trim('[').Trim(']').Trim('{').Trim('}').Replace("'", "").Replace("\"", "");

            Type t = typeof(T);
            object obj = Activator.CreateInstance(t);
            var properties = t.GetProperties();

            string[] arr = recive.Split(',');
            for (int i = 0; i < arr.Count(); i++)
            {
                for (int k = 0; k < properties.Count(); k++)
                {
                    string Name = arr[i].Substring(0, arr[i].IndexOf(":"));
                    object Value = arr[i].Substring(arr[i].IndexOf(":") + 1);
                    if (properties[k].Name.Equals(Name))
                    {
                        if (properties[k].PropertyType.Equals(typeof(int)))
                        {
                            properties[k].SetValue(obj, Convert.ToInt32(Value), null);
                        }
                        else if (properties[k].PropertyType.Equals(typeof(string)))
                        {
                            properties[k].SetValue(obj, Convert.ToString(Value), null);
                        }
                        else if (properties[k].PropertyType.Equals(typeof(long)))
                        {
                            properties[k].SetValue(obj, Convert.ToInt64(Value), null);
                        }
                        else if (properties[k].PropertyType.Equals(typeof(decimal)))
                        {
                            properties[k].SetValue(obj, Convert.ToDecimal(Value), null);
                        }
                        else if (properties[k].PropertyType.Equals(typeof(double)))
                        {
                            properties[k].SetValue(obj, Convert.ToDouble(Value), null);
                        }
                        else if (properties[k].PropertyType.Equals(typeof(Nullable<int>)))
                        {
                            properties[k].SetValue(obj, Convert.ToInt32(Value), null);
                        }
                        else if (properties[k].PropertyType.Equals(typeof(Nullable<decimal>)))
                        {
                            properties[k].SetValue(obj, Convert.ToDecimal(Value), null);
                        }
                        else if (properties[k].PropertyType.Equals(typeof(Nullable<long>)))
                        {
                            properties[k].SetValue(obj, Convert.ToInt64(Value), null);
                        }
                        else if (properties[k].PropertyType.Equals(typeof(Nullable<double>)))
                        {
                            properties[k].SetValue(obj, Convert.ToDouble(Value), null);
                        }
                        else if (properties[k].PropertyType.Equals(typeof(Nullable<DateTime>)))
                        {
                            properties[k].SetValue(obj, Convert.ToDateTime(Value), null);
                        }
                    }
                }
            }
            return (T)obj;
        }

        /// <summary>
        /// 多条Json数据转换为泛型数据
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="jsonArr">字符窜(格式为{"Name":[{"a":,"b":},{"a":,"b":},{"a":,"b":}]})</param>
        /// <returns></returns>
        public static List<T> ConvertToList<T>(string jsonArr)
        {
            string strJson = jsonArr.Trim('{').Trim('}');
            string strName = strJson.Substring(0, strJson.IndexOf(":"));
            strJson = strJson.Substring(strJson.IndexOf(":") + 1);
            if (!string.IsNullOrEmpty(jsonArr) && strJson.StartsWith("[") && strJson.EndsWith("]"))
            {
                Type t = typeof(T);
                var proPerties = t.GetProperties();
                List<T> list = new List<T>();
                string recive = strJson.Trim('[').Trim(']');//.Replace("'", "").Replace("\"", "");
                string[] reciveArr = recive.Replace("},{", "};{").Split(';');
                foreach (string item in reciveArr)
                {
                    string strPara = string.Format("{0}:[{1}]", strName, item);
                    T obj = ConvertToEntity<T>(strPara);
                    list.Add(obj);
                }
                return list;
            }
            return null;
        }

        #endregion
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值