C#通用JSON帮组类

jopen 10年前

using System;  using System.Data;  using System.Text;  using System.Collections.Generic;  using System.Reflection;  using System.Data.Common;  using System.Collections;  using System.IO;  using System.Text.RegularExpressions;  using System.Runtime.Serialization.Json;      namespace ZZUdp.Tool  {      public static class JsonHepler      {          /// <summary>          /// List转成json           /// </summary>          /// <typeparam name="T"></typeparam>          /// <param name="jsonName"></param>          /// <param name="list"></param>          /// <returns></returns>          public static string ListToJson<T>(IList<T> list, string jsonName)          {              StringBuilder Json = new StringBuilder();              if (string.IsNullOrEmpty(jsonName))                  jsonName = list[0].GetType().Name;              Json.Append("{\"" + jsonName + "\":[");              if (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;                          object o = pi[j].GetValue(list[i], null);                          string v = string.Empty;                          if (o != null)                          {                              type = o.GetType();                              v = o.ToString();                          }                          else                          {                              type = typeof(string);                          }                            Json.Append("\"" + pi[j].Name.ToString() + "\":" + StringFormat(v, type));                            if (j < pi.Length - 1)                          {                              Json.Append(",");                          }                      }                      Json.Append("}");                      if (i < list.Count - 1)                      {                          Json.Append(",");                      }                  }              }              Json.Append("]}");              return Json.ToString();          }            /// <summary>          /// 序列化集合对象          /// </summary>          public static string JsonSerializerByArrayData<T>(T[] tArray)          {              DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T[]));              MemoryStream ms = new MemoryStream();              ser.WriteObject(ms, tArray);              string jsonString = Encoding.UTF8.GetString(ms.ToArray());              ms.Close();              string p = @"\\/Date\((\d+)\+\d+\)\\/";              MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);              Regex reg = new Regex(p);              jsonString = reg.Replace(jsonString, matchEvaluator);              return jsonString;          }            /// <summary>          /// 序列化单个对象          /// </summary>          public static string JsonSerializerBySingleData<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();              string p = @"\\/Date\((\d+)\+\d+\)\\/";              MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);              Regex reg = new Regex(p);              jsonString = reg.Replace(jsonString, matchEvaluator);              return jsonString;          }            /// <summary>           /// 反序列化单个对象          /// </summary>           public static T JsonDeserializeBySingleData<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>           /// 反序列化集合对象          /// </summary>           public static T[] JsonDeserializeByArrayData<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[] arrayObj = (T[])ser.ReadObject(ms);              return arrayObj;          }            /// <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="list"></param>          /// <returns></returns>          public static string ListToJson<T>(IList<T> list)          {              object obj = list[0];              return ListToJson<T>(list, obj.GetType().Name);          }            /// <summary>           /// 对象转换为Json字符串           /// </summary>           /// <param name="jsonObject">对象</param>           /// <returns>Json字符串</returns>           public static string ToJson(object jsonObject)          {              try              {                  StringBuilder jsonString = new StringBuilder();                  jsonString.Append("{");                  PropertyInfo[] propertyInfo = jsonObject.GetType().GetProperties();                  for (int i = 0; i < propertyInfo.Length; i++)                  {                      object objectValue = propertyInfo[i].GetGetMethod().Invoke(jsonObject, null);                      if (objectValue == null)                      {                          continue;                      }                      StringBuilder value = new StringBuilder();                      if (objectValue is DateTime || objectValue is Guid || objectValue is TimeSpan)                      {                          value.Append("\"" + objectValue.ToString() + "\"");                      }                      else if (objectValue is string)                      {                          value.Append("\"" + objectValue.ToString() + "\"");                      }                      else if (objectValue is IEnumerable)                      {                          value.Append(ToJson((IEnumerable)objectValue));                      }                      else                      {                          value.Append("\"" + objectValue.ToString() + "\"");                      }                      jsonString.Append("\"" + propertyInfo[i].Name + "\":" + value + ","); ;                  }                  return jsonString.ToString().TrimEnd(',') + "}";              }              catch (Exception ex)              {                  throw ex;              }          }            /// <summary>           /// 对象集合转换Json           /// </summary>           /// <param name="array">集合对象</param>           /// <returns>Json字符串</returns>           public static string ToJson(IEnumerable array)          {              string jsonString = "[";              foreach (object item in array)              {                  jsonString += ToJson(item) + ",";              }              if (jsonString.Length > 1)              {                  jsonString.Remove(jsonString.Length - 1, jsonString.Length);              }              else              {                  jsonString = "[]";              }              return jsonString + "]";          }            /// <summary>           /// 普通集合转换Json           /// </summary>           /// <param name="array">集合对象</param>           /// <returns>Json字符串</returns>           public static string ToArrayString(IEnumerable array)          {              string jsonString = "[";              foreach (object item in array)              {                  jsonString = ToJson(item.ToString()) + ",";              }              jsonString.Remove(jsonString.Length - 1, jsonString.Length);              return jsonString + "]";          }            /// <summary>           /// Datatable转换为Json           /// </summary>           /// <param name="table">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("]");              if (jsonString.Length == 1)              {                  return "[]";              }              return jsonString.ToString();          }            /// <summary>          /// DataTable转成Json           /// </summary>          /// <param name="jsonName"></param>          /// <param name="dt"></param>          /// <returns></returns>          public static string ToJson(DataTable dt, string jsonName)          {              StringBuilder Json = new StringBuilder();              if (string.IsNullOrEmpty(jsonName))                  jsonName = dt.TableName;              Json.Append("{\"" + jsonName + "\":[");              if (dt.Rows.Count > 0)              {                  for (int i = 0; i < dt.Rows.Count; i++)                  {                      Json.Append("{");                      for (int j = 0; j < dt.Columns.Count; j++)                      {                          Type type = dt.Rows[i][j].GetType();                          Json.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":" + StringFormat(dt.Rows[i][j] is DBNull ? string.Empty : dt.Rows[i][j].ToString(), type));                          if (j < dt.Columns.Count - 1)                          {                              Json.Append(",");                          }                      }                      Json.Append("}");                      if (i < dt.Rows.Count - 1)                      {                          Json.Append(",");                      }                  }              }              Json.Append("]}");              return Json.ToString();          }            /// <summary>           /// DataReader转换为Json           /// </summary>           /// <param name="dataReader">DataReader对象</param>           /// <returns>Json字符串</returns>           public static string ToJson(IDataReader dataReader)          {              try              {                  StringBuilder jsonString = new StringBuilder();                  jsonString.Append("[");                    while (dataReader.Read())                  {                      jsonString.Append("{");                      for (int i = 0; i < dataReader.FieldCount; i++)                      {                          Type type = dataReader.GetFieldType(i);                          string strKey = dataReader.GetName(i);                          string strValue = dataReader[i].ToString();                          jsonString.Append("\"" + strKey + "\":");                          strValue = StringFormat(strValue, type);                          if (i < dataReader.FieldCount - 1)                          {                              jsonString.Append(strValue + ",");                          }                          else                          {                              jsonString.Append(strValue);                          }                      }                      jsonString.Append("},");                  }                  if (!dataReader.IsClosed)                  {                      dataReader.Close();                  }                  jsonString.Remove(jsonString.Length - 1, 1);                  jsonString.Append("]");                  if (jsonString.Length == 1)                  {                      return "[]";                  }                  return jsonString.ToString();              }              catch (Exception ex)              {                  throw ex;              }          }            /// <summary>           /// DataSet转换为Json           /// </summary>           /// <param name="dataSet">DataSet对象</param>           /// <returns>Json字符串</returns>           public static string ToJson(DataSet dataSet)          {              string jsonString = "{";              foreach (DataTable table in dataSet.Tables)              {                  jsonString += "\"" + table.TableName + "\":" + ToJson(table) + ",";              }              jsonString = jsonString.TrimEnd(',');              return jsonString + "}";          }            /// <summary>          /// 过滤特殊字符          /// </summary>          /// <param name="s"></param>          /// <returns></returns>          public 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;                      case '\v':                          sb.Append("\\v"); break;                      case '\0':                          sb.Append("\\0"); break;                      default:                          sb.Append(c); break;                  }              }              return sb.ToString();          }            /// <summary>          /// 格式化字符型、日期型、布尔型          /// </summary>          /// <param name="str"></param>          /// <param name="type"></param>          /// <returns></returns>          private static string StringFormat(string str, Type type)          {              if (type != typeof(string) && string.IsNullOrEmpty(str))              {                  str = "\"" + str + "\"";              }              else if (type == typeof(string))              {                  str = String2Json(str);                  str = "\"" + str + "\"";              }              else if (type == typeof(DateTime))              {                  str = "\"" + str + "\"";              }              else if (type == typeof(bool))              {                  str = str.ToLower();              }              else if (type == typeof(byte[]))              {                  str = "\"" + str + "\"";              }              else if (type == typeof(Guid))              {                  str = "\"" + str + "\"";              }              return str;          }      }  }