1using System; 2using System.Data; 3using System.Text; 4using System.Collections.Generic; 5using System.Reflection; 6using System.Data.Common; 7using System.Collections; 8using System.Web.UI.WebControls; 9using System.Web.UI.HtmlControls; 10using System.IO; 11using System.Text.RegularExpressions; 12using System.Runtime.Serialization.Json; 13 14 15namespace System.Common 16{ 17 public static class Json 18 { 19 /// <summary> 20 /// List转成json 21 /// </summary> 22 /// <typeparam name="T"></typeparam> 23 /// <param name="jsonName"></param> 24 /// <param name="list"></param> 25 /// <returns></returns> 26 public static string ListToJson<T>(IList<T> list, string jsonName) 27 { 28 StringBuilder Json = new StringBuilder(); 29 if (string.IsNullOrEmpty(jsonName)) 30 jsonName = list[0].GetType().Name; 31 Json.Append("{\"" + jsonName + "\":["); 32 if (list.Count > 0) 33 { 34 for (int i = 0; i < list.Count; i++) 35 { 36 T obj = Activator.CreateInstance<T>(); 37 PropertyInfo[] pi = obj.GetType().GetProperties(); 38 Json.Append("{"); 39 for (int j = 0; j < pi.Length; j++) 40 { 41 Type type; 42 object o = pi[j].GetValue(list[i], null); 43 string v = string.Empty; 44 if (o != null) 45 { 46 type = o.GetType(); 47 v = o.ToString(); 48 } 49 else 50 { 51 type = typeof(string); 52 } 53 54 Json.Append("\"" + pi[j].Name.ToString() + "\":" + StringFormat(v, type)); 55 56 if (j < pi.Length - 1) 57 { 58 Json.Append(","); 59 } 60 } 61 Json.Append("}"); 62 if (i < list.Count - 1) 63 { 64 Json.Append(","); 65 } 66 } 67 } 68 Json.Append("]}"); 69 return Json.ToString(); 70 } 71 72 /// <summary> 73 /// 序列化集合对象 74 /// </summary> 75 public static string JsonSerializerByArrayData<T>(T[] tArray) 76 { 77 DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T[])); 78 MemoryStream ms = new MemoryStream(); 79 ser.WriteObject(ms, tArray); 80 string jsonString = Encoding.UTF8.GetString(ms.ToArray()); 81 ms.Close(); 82 string p = @"\\/Date\((\d+)\+\d+\)\\/"; 83 MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString); 84 Regex reg = new Regex(p); 85 jsonString = reg.Replace(jsonString, matchEvaluator); 86 return jsonString; 87 } 88 89 /// <summary> 90 /// 序列化单个对象 91 /// </summary> 92 public static string JsonSerializerBySingleData<T>(T t) 93 { 94 DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); 95 MemoryStream ms = new MemoryStream(); 96 ser.WriteObject(ms, t); 97 string jsonString = Encoding.UTF8.GetString(ms.ToArray()); 98 ms.Close(); 99 string p = @"\\/Date\((\d+)\+\d+\)\\/"; 100 MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString); 101 Regex reg = new Regex(p); 102 jsonString = reg.Replace(jsonString, matchEvaluator); 103 return jsonString; 104 } 105 106 /// <summary> 107 /// 反序列化单个对象 108 /// </summary> 109 public static T JsonDeserializeBySingleData<T>(string jsonString) 110 { 111 //将"yyyy-MM-dd HH:mm:ss"格式的字符串转为"\/Date(1294499956278+0800)\/"格式 112 string p = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}"; 113 MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate); 114 Regex reg = new Regex(p); 115 jsonString = reg.Replace(jsonString, matchEvaluator); 116 DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); 117 MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)); 118 T obj = (T)ser.ReadObject(ms); 119 return obj; 120 } 121 122 /// <summary> 123 /// 反序列化集合对象 124 /// </summary> 125 public static T[] JsonDeserializeByArrayData<T>(string jsonString) 126 { 127 //将"yyyy-MM-dd HH:mm:ss"格式的字符串转为"\/Date(1294499956278+0800)\/"格式 128 string p = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}"; 129 MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate); 130 Regex reg = new Regex(p); 131 jsonString = reg.Replace(jsonString, matchEvaluator); 132 DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T[])); 133 MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)); 134 T[] arrayObj = (T[])ser.ReadObject(ms); 135 return arrayObj; 136 } 137 138 /// <summary> 139 /// 将Json序列化的时间由/Date(1294499956278+0800)转为字符串 140 /// </summary> 141 private static string ConvertJsonDateToDateString(Match m) 142 { 143 string result = string.Empty; 144 DateTime dt = new DateTime(1970, 1, 1); 145 dt = dt.AddMilliseconds(long.Parse(m.Groups[1].Value)); 146 dt = dt.ToLocalTime(); 147 result = dt.ToString("yyyy-MM-dd HH:mm:ss"); 148 return result; 149 } 150 151 /// <summary> 152 /// 将时间字符串转为Json时间 153 /// </summary> 154 private static string ConvertDateStringToJsonDate(Match m) 155 { 156 string result = string.Empty; 157 DateTime dt = DateTime.Parse(m.Groups[0].Value); 158 dt = dt.ToUniversalTime(); 159 TimeSpan ts = dt - DateTime.Parse("1970-01-01"); 160 result = string.Format("\\/Date({0}+0800)\\/", ts.TotalMilliseconds); 161 return result; 162 } 163 164 /// <summary> 165 /// List转成json 166 /// </summary> 167 /// <typeparam name="T"></typeparam> 168 /// <param name="list"></param> 169 /// <returns></returns> 170 public static string ListToJson<T>(IList<T> list) 171 { 172 object obj = list[0]; 173 return ListToJson<T>(list, obj.GetType().Name); 174 } 175 176 /// <summary> 177 /// 对象转换为Json字符串 178 /// </summary> 179 /// <param name="jsonObject">对象</param> 180 /// <returns>Json字符串</returns> 181 public static string ToJson(object jsonObject) 182 { 183 try 184 { 185 StringBuilder jsonString = new StringBuilder(); 186 jsonString.Append("{"); 187 PropertyInfo[] propertyInfo = jsonObject.GetType().GetProperties(); 188 for (int i = 0; i < propertyInfo.Length; i++) 189 { 190 object objectValue = propertyInfo[i].GetGetMethod().Invoke(jsonObject, null); 191 if (objectValue == null) 192 { 193 continue; 194 } 195 StringBuilder value = new StringBuilder(); 196 if (objectValue is DateTime || objectValue is Guid || objectValue is TimeSpan) 197 { 198 value.Append("\"" + objectValue.ToString() + "\""); 199 } 200 else if (objectValue is string) 201 { 202 value.Append("\"" + objectValue.ToString() + "\""); 203 } 204 else if (objectValue is IEnumerable) 205 { 206 value.Append(ToJson((IEnumerable)objectValue)); 207 } 208 else 209 { 210 value.Append("\"" + objectValue.ToString() + "\""); 211 } 212 jsonString.Append("\"" + propertyInfo[i].Name + "\":" + value + ","); ; 213 } 214 return jsonString.ToString().TrimEnd(',') + "}"; 215 } 216 catch (Exception ex) 217 { 218 throw ex; 219 } 220 } 221 222 /// <summary> 223 /// 对象集合转换Json 224 /// </summary> 225 /// <param name="array">集合对象</param> 226 /// <returns>Json字符串</returns> 227 public static string ToJson(IEnumerable array) 228 { 229 string jsonString = "["; 230 foreach (object item in array) 231 { 232 jsonString += ToJson(item) + ","; 233 } 234 if (jsonString.Length > 1) 235 { 236 jsonString.Remove(jsonString.Length - 1, jsonString.Length); 237 } 238 else 239 { 240 jsonString = "[]"; 241 } 242 return jsonString + "]"; 243 } 244 245 /// <summary> 246 /// 普通集合转换Json 247 /// </summary> 248 /// <param name="array">集合对象</param> 249 /// <returns>Json字符串</returns> 250 public static string ToArrayString(IEnumerable array) 251 { 252 string jsonString = "["; 253 foreach (object item in array) 254 { 255 jsonString = ToJson(item.ToString()) + ","; 256 } 257 jsonString.Remove(jsonString.Length - 1, jsonString.Length); 258 return jsonString + "]"; 259 } 260 261 /// <summary> 262 /// Datatable转换为Json 263 /// </summary> 264 /// <param name="table">Datatable对象</param> 265 /// <returns>Json字符串</returns> 266 public static string ToJson(DataTable dt) 267 { 268 StringBuilder jsonString = new StringBuilder(); 269 jsonString.Append("["); 270 DataRowCollection drc = dt.Rows; 271 for (int i = 0; i < drc.Count; i++) 272 { 273 jsonString.Append("{"); 274 for (int j = 0; j < dt.Columns.Count; j++) 275 { 276 string strKey = dt.Columns[j].ColumnName; 277 string strValue = drc[i][j].ToString(); 278 Type type = dt.Columns[j].DataType; 279 jsonString.Append("\"" + strKey + "\":"); 280 strValue = StringFormat(strValue, type); 281 if (j < dt.Columns.Count - 1) 282 { 283 jsonString.Append(strValue + ","); 284 } 285 else 286 { 287 jsonString.Append(strValue); 288 } 289 } 290 jsonString.Append("},"); 291 } 292 jsonString.Remove(jsonString.Length - 1, 1); 293 jsonString.Append("]"); 294 if (jsonString.Length == 1) 295 { 296 return "[]"; 297 } 298 return jsonString.ToString(); 299 } 300 301 /// <summary> 302 /// DataTable转成Json 303 /// </summary> 304 /// <param name="jsonName"></param> 305 /// <param name="dt"></param> 306 /// <returns></returns> 307 public static string ToJson(DataTable dt, string jsonName) 308 { 309 StringBuilder Json = new StringBuilder(); 310 if (string.IsNullOrEmpty(jsonName)) 311 jsonName = dt.TableName; 312 Json.Append("{\"" + jsonName + "\":["); 313 if (dt.Rows.Count > 0) 314 { 315 for (int i = 0; i < dt.Rows.Count; i++) 316 { 317 Json.Append("{"); 318 for (int j = 0; j < dt.Columns.Count; j++) 319 { 320 Type type = dt.Rows[i][j].GetType(); 321 Json.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":" + StringFormat(dt.Rows[i][j] is DBNull ? string.Empty : dt.Rows[i][j].ToString(), type)); 322 if (j < dt.Columns.Count - 1) 323 { 324 Json.Append(","); 325 } 326 } 327 Json.Append("}"); 328 if (i < dt.Rows.Count - 1) 329 { 330 Json.Append(","); 331 } 332 } 333 } 334 Json.Append("]}"); 335 return Json.ToString(); 336 } 337 338 /// <summary> 339 /// DataReader转换为Json 340 /// </summary> 341 /// <param name="dataReader">DataReader对象</param> 342 /// <returns>Json字符串</returns> 343 public static string ToJson(IDataReader dataReader) 344 { 345 try 346 { 347 StringBuilder jsonString = new StringBuilder(); 348 jsonString.Append("["); 349 350 while (dataReader.Read()) 351 { 352 jsonString.Append("{"); 353 for (int i = 0; i < dataReader.FieldCount; i++) 354 { 355 Type type = dataReader.GetFieldType(i); 356 string strKey = dataReader.GetName(i); 357 string strValue = dataReader[i].ToString(); 358 jsonString.Append("\"" + strKey + "\":"); 359 strValue = StringFormat(strValue, type); 360 if (i < dataReader.FieldCount - 1) 361 { 362 jsonString.Append(strValue + ","); 363 } 364 else 365 { 366 jsonString.Append(strValue); 367 } 368 } 369 jsonString.Append("},"); 370 } 371 if (!dataReader.IsClosed) 372 { 373 dataReader.Close(); 374 } 375 jsonString.Remove(jsonString.Length - 1, 1); 376 jsonString.Append("]"); 377 if (jsonString.Length == 1) 378 { 379 return "[]"; 380 } 381 return jsonString.ToString(); 382 } 383 catch (Exception ex) 384 { 385 throw ex; 386 } 387 } 388 389 /// <summary> 390 /// DataSet转换为Json 391 /// </summary> 392 /// <param name="dataSet">DataSet对象</param> 393 /// <returns>Json字符串</returns> 394 public static string ToJson(DataSet dataSet) 395 { 396 string jsonString = "{"; 397 foreach (DataTable table in dataSet.Tables) 398 { 399 jsonString += "\"" + table.TableName + "\":" + ToJson(table) + ","; 400 } 401 jsonString = jsonString.TrimEnd(','); 402 return jsonString + "}"; 403 } 404 405 /// <summary> 406 /// 过滤特殊字符 407 /// </summary> 408 /// <param name="s"></param> 409 /// <returns></returns> 410 public static string String2Json(String s) 411 { 412 StringBuilder sb = new StringBuilder(); 413 for (int i = 0; i < s.Length; i++) 414 { 415 char c = s.ToCharArray()[i]; 416 switch (c) 417 { 418 case '\"': 419 sb.Append("\\\""); break; 420 case '\\': 421 sb.Append("\\\\"); break; 422 case '/': 423 sb.Append("\\/"); break; 424 case '\b': 425 sb.Append("\\b"); break; 426 case '\f': 427 sb.Append("\\f"); break; 428 case '\n': 429 sb.Append("\\n"); break; 430 case '\r': 431 sb.Append("\\r"); break; 432 case '\t': 433 sb.Append("\\t"); break; 434 case '\v': 435 sb.Append("\\v"); break; 436 case '\0': 437 sb.Append("\\0"); break; 438 default: 439 sb.Append(c); break; 440 } 441 } 442 return sb.ToString(); 443 } 444 445 /// <summary> 446 /// 格式化字符型、日期型、布尔型 447 /// </summary> 448 /// <param name="str"></param> 449 /// <param name="type"></param> 450 /// <returns></returns> 451 private static string StringFormat(string str, Type type) 452 { 453 if (type != typeof(string) && string.IsNullOrEmpty(str)) 454 { 455 str = "\"" + str + "\""; 456 } 457 else if (type == typeof(string)) 458 { 459 str = String2Json(str); 460 str = "\"" + str + "\""; 461 } 462 else if (type == typeof(DateTime)) 463 { 464 str = "\"" + str + "\""; 465 } 466 else if (type == typeof(bool)) 467 { 468 str = str.ToLower(); 469 } 470 else if (type == typeof(byte[])) 471 { 472 str = "\"" + str + "\""; 473 }else if(type==typeof(Guid)) 474 { 475 str = "\"" + str + "\""; 476 } 477 return str; 478 } 479 480 481 public static void RegistAjax(HtmlHead Header, Type type) 482 { 483 string assemblyName = type.FullName + "," + type.Assembly.FullName.Substring(0, type.Assembly.FullName.IndexOf(",")); 484 if (type.Assembly.FullName.StartsWith("App_Code.")) 485 { 486 assemblyName = type.FullName + ",App_Code"; 487 } 488 Literal l = new Literal(); 489 l.Text = "\n<script type=\"text/javascript\" src=\"/ajaxpro/prototype.ashx\"></script>\n" 490 + "<script type=\"text/javascript\" src=\"/ajaxpro/core.ashx\"></script>\n" 491 + "<script type=\"text/javascript\" src=\"/ajaxpro/converter.ashx\"></script>\n" 492 + "<script type=\"text/javascript\" src=\"/ajaxpro/" + assemblyName + ".ashx\"></script>\n"; 493 Header.Controls.Add(l); 494 } 495 } 496}
C#的Json操作类,支持数组,DataTable,DataReader等转Json
Wesley13
2021-10-11
1381 0 0
点赞
收藏
评论区
加载中...