教你使用JSON
来源:优易学  2011-12-13 13:33:20   【优易学:中国教育考试门户网】   资料下载   IT书店

  在服务器端定义的一些方法,只要加上ajax库的某个属性,则可在client-side中直接进行调用,如果服务器端方法有返回值的话,在客户端还能接收并像使用服务器端对象一般,我之前一直很疑惑,为什么能做到如此,当时看到在服务器端返回一个datatable对象,然后就看到在客户端使用这个datatable对象了,使用的代码和方式就像再写服务器端代码一样,当时很是疑惑,因为自己刚接触web不久,最终没能正面的帮客户解决使用中的一个问题,而是提供了另一种比较笨的方式callback。后来有幸看到一篇介绍JSON的文章,渐渐的思路有点清晰起来,猜想应该是在服务器端将某个对象序列化成JSON,然后在客户端再将JSON实例化成某个对象,为了印证我的思路,google上一搜,果然已经有了很多将对象序列化成JSON的代码,附上codeproject上的一个实现:
  还有人专门从Anthem.net中专门剥离出了这部分代码,这里也一并附上:
  public class Converter
  {
  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;
  }
  }

[1] [2] 下一页

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训