using System;
using System.Data;
using System.Text;
using System.IO;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Web.Script.Serialization;
using System.Collections;

namespace DSWeb.TruckMng.Helper
{
    public class JsonHelper
    {
        public static T Deserialize<T>(string json)
        {
            T obj = Activator.CreateInstance<T>();
            obj = Newtonsoft.Json.JsonConvert.DeserializeObject<T>(json);
            return obj;
        }

        public static string Serialize<T>(T obj)
        {
            string retVal = string.Empty;
            retVal = Newtonsoft.Json.JsonConvert.SerializeObject(obj);
            return retVal;
        }


        #region 转化Dataset or DataTable

        #region 直接转为Json字符串

        public static string DataTableToJSON(DataTable dt, string dtName)
        {
            StringBuilder sb = new StringBuilder();
            StringWriter sw = new StringWriter(sb);

            using (JsonWriter jw = new JsonTextWriter(sw))
            {
                JsonSerializer ser = new JsonSerializer();
                jw.WriteStartObject();
                jw.WritePropertyName(dtName);
                jw.WriteStartArray();
                foreach (DataRow dr in dt.Rows)
                {
                    jw.WriteStartObject();

                    foreach (DataColumn dc in dt.Columns)
                    {
                        jw.WritePropertyName(dc.ColumnName);
                        ser.Serialize(jw, dr[dc].ToString());
                    }

                    jw.WriteEndObject();
                }
                jw.WriteEndArray();
                jw.WriteEndObject();

                sw.Close();
                jw.Close();

            }

            return sb.ToString();
        }
        #endregion

        #region 转化为Controller中可以使用Json(new {..})使用的方式


        #region 例子
        //public static Dictionary<string, object> getTable()
        //{
        //    string sql = "select user_name, active_indicator, create_date from users";
        //    string connString = "database=db; server=localhost; user id=sa;";

        //    return JsonMethods.ToJson(GetDataTable(sql, connString));
        //}

        //private static DataTable GetDataTable(string sql, string connString)
        //{
        //    using (SqlConnection myConnection = new SqlConnection(connString))
        //    {
        //        using (SqlCommand myCommand = new SqlCommand(sql, myConnection))
        //        {
        //            myConnection.Open();
        //            using (SqlDataReader myReader = myCommand.ExecuteReader())
        //            {
        //                DataTable myTable = new DataTable();
        //                myTable.TableName = "mydt";
        //                myTable.Load(myReader);
        //                myConnection.Close();
        //                return myTable;
        //            }
        //        }
        //    }
        //}

        //Controller中 return Json(new {data=getTable().ToArray()});
        #endregion 

        private static List<Dictionary<string, object>> RowsToDictionary(DataTable table)
        {
            List<Dictionary<string, object>> objs =
                new List<Dictionary<string, object>>();
            if (table == null)
                return objs;
            foreach (DataRow dr in table.Rows)
            {
                Dictionary<string, object> drow = new Dictionary<string, object>();
                for (int i = 0; i < table.Columns.Count; i++)
                {
                    drow.Add(table.Columns[i].ColumnName, dr[i]);
                }
                objs.Add(drow);
            }

            return objs;
        }
        /// <summary>
        /// 把DataTable转化为Controller可以转为Json数据的数据集合

        /// </summary>
        /// <param name="table">需要转换的DataTable</param>
        /// <returns></returns>
        public static List<Dictionary<string, object>> ToJson(DataTable table)
        {
            return RowsToDictionary(table);
        }
        //public static Dictionary<string, object> ToJson(DataTable table)
        //{
        //    Dictionary<string, object> dict = new Dictionary<string, object>();
        //    dict.Add(table.TableName, RowsToDictionary(table));
        //    return dict;
        //}

        

        /// <summary>
        /// 把DataSet转化为Controller可以转为Json数据的数据集合

        /// </summary>
        /// <param name="data">需要转换的DataSet</param>
        /// <returns></returns>
        public static Dictionary<string, object> ToJson(DataSet data)
        {
            Dictionary<string, object> dict = new Dictionary<string, object>();
            foreach (DataTable table in data.Tables)
            {
                dict.Add(table.TableName, RowsToDictionary(table));
            }
            return dict;
        }
        #endregion 

        #endregion

        static public object JsonGetValue(string jsondata,string jsonname)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            Dictionary<string, object> json = (Dictionary<string, object>)serializer.DeserializeObject(jsondata);
            object value;
            if (!json.TryGetValue(jsonname, out value))
            {
                throw new Exception("数据中不存在此值!");
            }
            return value;
        }

        /// <summary>
        /// 获取JsonString
        /// </summary>
        /// <param name="ds">DataSet</param>
        /// <returns></returns>
        public static string GetJsonString(DataSet ds) 
        {
            string res = ""; ;
            IList<Hashtable> mList = new List<Hashtable>();
            try {
                foreach (DataRow row in ds.Tables[0].Rows) 
                {
                    Hashtable ht = new Hashtable();
                    foreach (DataColumn col in ds.Tables[0].Columns) 
                    {
                        ht.Add(col.ColumnName, row[col.ColumnName]);
                    }
                    mList.Add(ht);
                }
                res = Newtonsoft.Json.JsonConvert.SerializeObject(mList);
               
            }
            catch (Exception ee) 
            {
                string error = ee.Message;
            }
            return res;
        }
    }
}