Json操作类
using System; using System.Collections; using System.Data; using System.Globalization; using System.Reflection; using System.Text; public class JSONHelper { public static string Convert2Json(object o) { StringBuilder sb = new StringBuilder(); WriteValue(sb, o); return sb.ToString(); } private static void WriteDataRow(StringBuilder sb, DataRow row) { sb.Append("{"); foreach (DataColumn column in row.Table.Columns) { sb.AppendFormat("\"{0}\":", column.ColumnName); WriteValue(sb, row[column]); sb.Append(","); } if (row.Table.Columns.Count > 0) { sb.Length--; } sb.Append("}"); } private static void WriteDataSet(StringBuilder sb, DataSet ds) { sb.Append("{\"Tables\":{"); foreach (DataTable table in ds.Tables) { sb.AppendFormat("\"{0}\":", table.TableName); WriteDataTable(sb, table); sb.Append(","); } if (ds.Tables.Count > 0) { sb.Length--; } sb.Append("}}"); } private static void WriteDataTable(StringBuilder sb, DataTable table) { sb.Append("{\"Rows\":["); foreach (DataRow row in table.Rows) { WriteDataRow(sb, row); sb.Append(","); } if (table.Rows.Count > 0) { sb.Length--; } sb.Append("]}"); } private static void WriteEnumerable(StringBuilder sb, IEnumerable e) { bool hasItems = false; sb.Append("["); foreach (object val in e) { WriteValue(sb, val); sb.Append(","); hasItems = true; } if (hasItems) { sb.Length--; } sb.Append("]"); } private static void WriteHashtable(StringBuilder sb, Hashtable e) { bool hasItems = false; sb.Append("{"); foreach (string key in e.Keys) { sb.AppendFormat("\"{0}\":", key.ToLower()); WriteValue(sb, e[key]); sb.Append(","); hasItems = true; } if (hasItems) { sb.Length--; } sb.Append("}"); } private static void WriteObject(StringBuilder sb, object o) { MemberInfo[] members = o.GetType().GetMembers(BindingFlags.Public | BindingFlags.Instance); sb.Append("{"); bool hasMembers = false; foreach (MemberInfo member in members) { bool hasValue = false; object val = null; if ((member.MemberType & MemberTypes.Field) == MemberTypes.Field) { val = ((FieldInfo) member).GetValue(o); hasValue = true; } else if ((member.MemberType & MemberTypes.Property) == MemberTypes.Property) { PropertyInfo property = (PropertyInfo) member; if (property.CanRead && (property.GetIndexParameters().Length == 0)) { val = property.GetValue(o, null); hasValue = true; } } if (hasValue) { sb.Append("\""); sb.Append(member.Name); sb.Append("\":"); WriteValue(sb, val); sb.Append(","); hasMembers = true; } } if (hasMembers) { sb.Length--; } sb.Append("}"); } private static void WriteString(StringBuilder sb, string s) { sb.Append("\""); foreach (char c in s) { switch (c) { case '\b': sb.Append(@"\b"); break; case '\t': sb.Append(@"\t"); break; case '\n': sb.Append(@"\n"); break; case '\f': sb.Append(@"\f"); break; case '\r': sb.Append(@"\r"); break; case '"': sb.Append("\\\""); break; case '\\': sb.Append(@"\\"); break; default: { int i = c; if ((i < 0x20) || (i > 0x7f)) { sb.AppendFormat(@"\u{0:X04}", i); } else { sb.Append(c); } break; } } } sb.Append("\""); } public static void WriteValue(StringBuilder sb, object val) { if ((val == null) || (val == DBNull.Value)) { sb.Append("null"); } else if ((val is string) || (val is Guid)) { WriteString(sb, val.ToString()); } else if (val is bool) { sb.Append(val.ToString().ToLower()); } else if (((((val is double) || (val is float)) || ((val is long) || (val is int))) || ((val is short) || (val is byte))) || (val is decimal)) { sb.AppendFormat(CultureInfo.InvariantCulture.NumberFormat, "{0}", new object[] { val }); } else if (val.GetType().IsEnum) { sb.Append((int) val); } else if (val is DateTime) { sb.Append("new Date(\""); sb.Append(((DateTime) val).ToString("MMMM, d yyyy HH:mm:ss", new CultureInfo("en-US", false).DateTimeFormat)); sb.Append("\")"); } else if (val is DataSet) { WriteDataSet(sb, val as DataSet); } else if (val is DataTable) { WriteDataTable(sb, val as DataTable); } else if (val is DataRow) { WriteDataRow(sb, val as DataRow); } else if (val is Hashtable) { WriteHashtable(sb, val as Hashtable); } else if (val is IEnumerable) { WriteEnumerable(sb, val as IEnumerable); } else { WriteObject(sb, val); } } }