JSON格式互轉集合,JSON格式轉集合
在工作中我們經常會遇到格式轉換的問題,有的時候是將JSON轉換成DataTable、DataSet或是List等,也有可能將DataTable、DataSet或是List轉換成JSON的,抽了點時間把這些方法整合了一下,希望對大家有所幫助,如果有什麼問題請指出來,共同探討。
代碼:

![]()
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Web;
5 using System.Text;
6 using System.Data;
7 using System.Data.Common;
8 using System.Collections;
9 using System.Reflection;
10
11 namespace BJYX.WEB.Public
12 {
13 public class Creat_Json
14 {
15 public Creat_Json()
16 {
17 //
18 // TODO: 在此處添加構造函數邏輯
19 //
20 }
21
22 public static string DataTable2Json(System.Data.DataTable dt)
23 {
24 System.Text.StringBuilder jsonBuilder = new System.Text.StringBuilder();
25 jsonBuilder.Append("{");
26 jsonBuilder.AppendFormat("\"total\":{0}, ", dt.Rows.Count);
27 jsonBuilder.Append("\"rows\":[ ");
28 for (int i = 0; i < dt.Rows.Count; i++)
29 {
30 jsonBuilder.Append("{");
31 for (int j = 0; j < dt.Columns.Count; j++)
32 {
33 jsonBuilder.Append("\"");
34 jsonBuilder.Append(dt.Columns[j].ColumnName);
35 jsonBuilder.Append("\":\"");
36 jsonBuilder.Append(dt.Rows[i][j].ToString().Replace("\\", "\\\\").Replace("'", "'").Replace("\t", " ").Replace("\r", " ").Replace("\n", "<br/>").Replace("\"", """));
37 jsonBuilder.Append("\",");
38 }
39 jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
40 jsonBuilder.Append("},");
41 }
42 jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
43 jsonBuilder.Append("]");
44 jsonBuilder.Append("}");
45 return jsonBuilder.ToString();
46 }
47 public static string DataTable2Json(System.Data.DataTable dt, int count)
48 {
49 System.Text.StringBuilder jsonBuilder = new System.Text.StringBuilder();
50 jsonBuilder.Append("{");
51 jsonBuilder.AppendFormat("\"total\":{0}, ", count);
52 jsonBuilder.Append("\"rows\":[ ");
53 for (int i = 0; i < dt.Rows.Count; i++)
54 {
55 jsonBuilder.Append("{");
56 for (int j = 0; j < dt.Columns.Count; j++)
57 {
58 jsonBuilder.Append("\"");
59 jsonBuilder.Append(dt.Columns[j].ColumnName);
60 jsonBuilder.Append("\":\"");
61 jsonBuilder.Append(dt.Rows[i][j].ToString().Replace("\\", "\\\\").Replace("'", "'").Replace("\t", " ").Replace("\r", " ").Replace("\n", "<br/>").Replace("\"", """));
62 jsonBuilder.Append("\",");
63 }
64 jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
65 jsonBuilder.Append("},");
66 }
67 jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
68 jsonBuilder.Append("]");
69 jsonBuilder.Append("}");
70 return jsonBuilder.ToString();
71 }
72 public static string DataTableToJson(System.Data.DataTable dt)
73 {
74 StringBuilder Json = new StringBuilder();
75 Json.Append("[");
76 if (dt.Rows.Count > 0)
77 {
78 for (int i = 0; i < dt.Rows.Count; i++)
79 {
80 Json.Append("{");
81 for (int j = 0; j < dt.Columns.Count; j++)
82 {
83 Json.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":\"" + dt.Rows[i][j].ToString().Replace("\\", "\\\\").Replace("'", "'").Replace("\t", " ").Replace("\r", " ").Replace("\n", "<br/>").Replace("\"", """) + "\"");
84 if (j < dt.Columns.Count - 1)
85 {
86 Json.Append(",");
87 }
88 }
89 Json.Append("}");
90 if (i < dt.Rows.Count - 1)
91 {
92 Json.Append(",");
93 }
94 }
95 }
96 Json.Append("]");
97 return Json.ToString().Replace("\\", "\\\\").Replace("\'", "\\\'").Replace("\t", " ").Replace("\r", " ").Replace("\n", "<br/>");//.Replace("\"", "'"); ;
98 }
99
100 /// <summary>
101 /// Table to JSON By FlexGrid
102 /// </summary>
103 /// <param name="ds"></param>
104 /// <param name="page"></param>
105 /// <returns></returns>
106 public static string DataTableToJson(System.Data.DataTable dt, int page, int total)
107 {
108 StringBuilder jsonStr = new StringBuilder();
109 jsonStr.Append("{");
110 jsonStr.Append("\"page\":" + page + ",");
111 jsonStr.Append("\"total\":" + total + ",");
112 jsonStr.Append("\"rows\":");
113 jsonStr.Append("[");
114
115 foreach (System.Data.DataRow dr in dt.Rows)
116 {
117 jsonStr.Append("{");
118
119 foreach (System.Data.DataColumn dc in dt.Columns)
120 {
121 jsonStr.Append("\"");
122 jsonStr.Append(dc.ColumnName);
123 jsonStr.Append("\"");
124 jsonStr.Append(":");
125
126 jsonStr.Append("\"");
127 jsonStr.Append(dr[dc].ToString().Trim());
128 jsonStr.Append("\" ,");
129 }
130
131 jsonStr.Remove(jsonStr.Length - 1, 1);
132 jsonStr.Append("}");
133 jsonStr.Append(",");
134 }
135 if (dt.Rows.Count > 0)
136 {
137 jsonStr.Remove(jsonStr.Length - 1, 1);
138 }
139 jsonStr.Append("]");
140 jsonStr.Append("}");
141
142 return jsonStr.ToString();
143 }
144
145 /// <summary>
146 /// List轉成json
147 /// </summary>
148 /// <typeparam name="T"></typeparam>
149 /// <param name="jsonName"></param>
150 /// <param name="list"></param>
151 /// <returns></returns>
152 public static string ListToJson<T>(IList<T> list, string jsonName)
153 {
154 StringBuilder Json = new StringBuilder();
155 if (string.IsNullOrEmpty(jsonName))
156 jsonName = list[0].GetType().Name;
157 Json.Append("{\"" + jsonName + "\":[");
158 if (list.Count > 0)
159 {
160 for (int i = 0; i < list.Count; i++)
161 {
162 T obj = Activator.CreateInstance<T>();
163 PropertyInfo[] pi = obj.GetType().GetProperties();
164 Json.Append("{");
165 for (int j = 0; j < pi.Length; j++)
166 {
167 Type type = pi[j].GetValue(list[i], null).GetType();
168 Json.Append("\"" + pi[j].Name.ToString() + "\":" + StringFormat(pi[j].GetValue(list[i], null).ToString(), type));
169
170 if (j < pi.Length - 1)
171 {
172 Json.Append(",");
173 }
174 }
175 Json.Append("}");
176 if (i < list.Count - 1)
177 {
178 Json.Append(",");
179 }
180 }
181 }
182 Json.Append("]}");
183 return Json.ToString();
184 }
185
186 /// <summary>
187 /// List轉成json
188 /// </summary>
189 /// <typeparam name="T"></typeparam>
190 /// <param name="list"></param>
191 /// <returns></returns>
192 public static string ListToJson<T>(IList<T> list)
193 {
194 object obj = list[0];
195 return ListToJson<T>(list, obj.GetType().Name);
196 }
197
198 /// <summary>
199 /// 對象轉換為Json字符串
200 /// </summary>
201 /// <param name="jsonObject">對象</param>
202 /// <returns>Json字符串</returns>
203 public static string ToJson(object jsonObject)
204 {
205 string jsonString = "{";
206 PropertyInfo[] propertyInfo = jsonObject.GetType().GetProperties();
207 for (int i = 0; i < propertyInfo.Length; i++)
208 {
209 object objectValue = propertyInfo[i].GetGetMethod().Invoke(jsonObject, null);
210 string value = string.Empty;
211 if (objectValue is DateTime || objectValue is Guid || objectValue is TimeSpan)
212 {
213 value = "'" + objectValue.ToString() + "'";
214 }
215 else if (objectValue is string)
216 {
217 value = "'" + ToJson(objectValue.ToString()) + "'";
218 }
219 else if (objectValue is IEnumerable)
220 {
221 value = ToJson((IEnumerable)objectValue);
222 }
223 else
224 {
225 value = ToJson(objectValue.ToString());
226 }
227 jsonString += "\"" + ToJson(propertyInfo[i].Name) + "\":" + value + ",";
228 }
229 jsonString.Remove(jsonString.Length - 1, jsonString.Length);
230 return jsonString + "}";
231 }
232
233 /// <summary>
234 /// 對象集合轉換Json
235 /// </summary>
236 /// <param name="array">集合對象</param>
237 /// <returns>Json字符串</returns>
238 public static string ToJson(IEnumerable array)
239 {
240 string jsonString = "[";
241 foreach (object item in array)
242 {
243 jsonString += ToJson(item) + ",";
244 }
245 jsonString.Remove(jsonString.Length - 1, jsonString.Length);
246 return jsonString + "]";
247 }
248
249 /// <summary>
250 /// 普通集合轉換Json
251 /// </summary>
252 /// <param name="array">集合對象</param>
253 /// <returns>Json字符串</returns>
254 public static string ToArrayString(IEnumerable array)
255 {
256 string jsonString = "[";
257 foreach (object item in array)
258 {
259 jsonString = ToJson(item.ToString()) + ",";
260 }
261 jsonString.Remove(jsonString.Length - 1, jsonString.Length);
262 return jsonString + "]";
263 }
264
265 /// <summary>
266 /// Datatable轉換為Json
267 /// </summary>
268 /// <param name="table">Datatable對象</param>
269 /// <returns>Json字符串</returns>
270 public static string ToJson(DataTable dt)
271 {
272 StringBuilder jsonString = new StringBuilder();
273 jsonString.Append("[");
274 DataRowCollection drc = dt.Rows;
275 for (int i = 0; i < drc.Count; i++)
276 {
277 jsonString.Append("{");
278 for (int j = 0; j < dt.Columns.Count; j++)
279 {
280 string strKey = dt.Columns[j].ColumnName;
281 string strValue = drc[i][j].ToString();
282 Type type = dt.Columns[j].DataType;
283 jsonString.Append("\"" + strKey + "\":");
284 strValue = StringFormat(strValue, type);
285 if (j < dt.Columns.Count - 1)
286 {
287 jsonString.Append(strValue + ",");
288 }
289 else
290 {
291 jsonString.Append(strValue);
292 }
293 }
294 jsonString.Append("},");
295 }
296 jsonString.Remove(jsonString.Length - 1, 1);
297 jsonString.Append("]");
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].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(DbDataReader dataReader)
344 {
345 StringBuilder jsonString = new StringBuilder();
346 jsonString.Append("[");
347 while (dataReader.Read())
348 {
349 jsonString.Append("{");
350 for (int i = 0; i < dataReader.FieldCount; i++)
351 {
352 Type type = dataReader.GetFieldType(i);
353 string strKey = dataReader.GetName(i);
354 string strValue = dataReader[i].ToString();
355 jsonString.Append("\"" + strKey + "\":");
356 strValue = StringFormat(strValue, type);
357 if (i < dataReader.FieldCount - 1)
358 {
359 jsonString.Append(strValue + ",");
360 }
361 else
362 {
363 jsonString.Append(strValue);
364 }
365 }
366 jsonString.Append("},");
367 }
368 dataReader.Close();
369 jsonString.Remove(jsonString.Length - 1, 1);
370 jsonString.Append("]");
371 return jsonString.ToString();
372 }
373 /// <summary>
374 /// 將IList轉成JSON
375 /// </summary>
376 /// <typeparam name="T"></typeparam>
377 /// <param name="jsonName"></param>
378 /// <param name="IL"></param>
379 /// <returns></returns>
380 public static string ObjectToJson<T>(IList<T> IL)
381 {
382 StringBuilder Json = new StringBuilder();
383 Json.Append("[");
384 if (IL.Count > 0)
385 {
386 for (int i = 0; i < IL.Count; i++)
387 {
388 T obj = Activator.CreateInstance<T>();
389 Type type = obj.GetType();
390 PropertyInfo[] pis = type.GetProperties();
391 Json.Append("{");
392 for (int j = 0; j < pis.Length; j++)
393 {
394 Json.Append("\"" + pis[j].Name.ToString() + "\":\"" + pis[j].GetValue(IL[i], null) + "\"");
395 if (j < pis.Length - 1)
396 {
397 Json.Append(",");
398 }
399 }
400 Json.Append("}");
401 if (i < IL.Count - 1)
402 {
403 Json.Append(",");
404 }
405 }
406 }
407 Json.Append("]");
408 return Json.ToString();
409 }
410
411 /// <summary>
412 /// 將IList轉成符合FlexiGrid控件格式的JSON
413 /// </summary>
414 /// <typeparam name="T"></typeparam>
415 /// <param name="IL"></param>
416 /// <param name="page">但前頁</param>
417 /// <param name="total">數據行數</param>
418 /// <returns></returns>
419 public static string ListToFlexiGridJson<T>(IList<T> IL, int page, int total)
420 {
421 StringBuilder Json = new StringBuilder();
422 Json.Append("{");
423 Json.Append("\"page\":" + page + ",");
424 Json.Append("\"total\":" + total + ",");
425 Json.Append("\"rows\":");
426 Json.Append("[");
427
428 if (IL.Count > 0)
429 {
430 for (int i = 0; i < IL.Count; i++)
431 {
432 T obj = Activator.CreateInstance<T>();
433 Type type = obj.GetType();
434 PropertyInfo[] pis = type.GetProperties();
435 Json.Append("{");
436 for (int j = 0; j < pis.Length; j++)
437 {
438 Json.Append("\"" + pis[j].Name.ToString() + "\":\"" + pis[j].GetValue(IL[i], null) + "\"");
439 if (j < pis.Length - 1)
440 {
441 Json.Append(",");
442 }
443 }
444 Json.Append("}");
445 if (i < IL.Count - 1)
446 {
447 Json.Append(",");
448 }
449 }
450 }
451 Json.Append("]");
452 Json.Append("}");
453 return Json.ToString();
454 }
455
456 /// <summary>
457 /// DataSet轉換為Json
458 /// </summary>
459 /// <param name="dataSet">DataSet對象</param>
460 /// <returns>Json字符串</returns>
461 public static string ToJson(DataSet dataSet)
462 {
463 string jsonString = "{";
464 foreach (DataTable table in dataSet.Tables)
465 {
466 jsonString += "\"" + table.TableName + "\":" + ToJson(table) + ",";
467 }
468 jsonString = jsonString.TrimEnd(',');
469 return jsonString + "}";
470 }
471
472 /// <summary>
473 /// 過濾特殊字符
474 /// </summary>
475 /// <param name="s"></param>
476 /// <returns></returns>
477 private static string String2Json(String s)
478 {
479 StringBuilder sb = new StringBuilder();
480 for (int i = 0; i < s.Length; i++)
481 {
482 char c = s.ToCharArray()[i];
483 switch (c)
484 {
485 case '\"':
486 sb.Append("\\\""); break;
487 case '\\':
488 sb.Append("\\\\"); break;
489 case '/':
490 sb.Append("\\/"); break;
491 case '\b':
492 sb.Append("\\b"); break;
493 case '\f':
494 sb.Append("\\f"); break;
495 case '\n':
496 sb.Append("\\n"); break;
497 case '\r':
498 sb.Append("\\r"); break;
499 case '\t':
500 sb.Append("\\t"); break;
501 default:
502 sb.Append(c); break;
503 }
504 }
505 return sb.ToString();
506 }
507
508 /// <summary>
509 /// 格式化字符型、日期型、布爾型
510 /// </summary>
511 /// <param name="str"></param>
512 /// <param name="type"></param>
513 /// <returns></returns>
514 private static string StringFormat(string str, Type type)
515 {
516 if (type == typeof(string))
517 {
518 str = String2Json(str);
519 str = "\"" + str + "\"";
520 }
521 else if (type == typeof(DateTime))
522 {
523 str = "\"" + str + "\"";
524 }
525 else if (type == typeof(bool))
526 {
527 str = str.ToLower();
528 }
529 return str;
530 }
531
532
533 }
534 }
View Code