|
|
最近因为一直在看ext
所以和json 打交道打的比较多,
以前都是习惯性的
把数据读到dataset
之后调用ConvertToJson方法
(博客园有这个,只不过与ext的json稍微有点bug,更正在下面)
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text;
using System.Collections;
using System.Globalization;
using System.Reflection;

 /**//// <summary>
/// ConvertToJson一个存储对象,收获Json
/// </summary>

//非著乃编。。。。

public class JsonConvert
  {
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(",");
}
// Remove the trailing comma.
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(",");
}
// Remove the trailing comma.
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(",");
}
// Remove the trailing comma.
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;
}
// Remove the trailing comma.
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;
}
// Remove the trailing comma.
if (hasItems)
 {
--sb.Length;
}
sb.Append("}");
}

private static void WriteObject(StringBuilder sb, object o)
 {
MemberInfo[] members = o.GetType().GetMembers(BindingFlags.Instance | BindingFlags.Public);
sb.Append("{");
bool hasMembers = false;
foreach (MemberInfo member in members)
 {
bool hasValue = false;
object val = null;
if ((member.MemberType & MemberTypes.Field) == MemberTypes.Field)
 {
FieldInfo field = (FieldInfo)member;
val = field.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 '\"':
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;
default:
int i = (int)c;
if (i < 32 || i > 127)
 {
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 == System.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}", 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);
}
&n |