JavaScript Serializer进行JSON序列化的简单示例

感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编来看看吧。
JSON是Javascript中常用的数据格式,然而,在.NET 2.0中没有内置序列化JSON的类,原因估计是当时Ajax尚未兴起。后来就有人写了一个Json.NET类库。.NET 3.5新增了一个把对象序列化为JSON字符串的类JavaScriptSerializer。

这个类位于System.Web.Script.Serialization名字空间中(非Web项目需要添加System.Web.Extensions.dll引用),其使用方法也是非常简单的:

// 分类
public class Category
{
  public int CategoryId { get; set; } // 分类编号
  public string CategoryName { get; set; } // 分类名
}

Category testCategory = new Category()
{
  CategoryId = 1,  CategoryName = Test
};

JavaScriptSerializer serializer = new JavaScriptSerializer();
Console.Write(serializer.Serialize(testCategory)); // 调用Serialize方法进行序列化
如果不希望序列化某个属性,可以给该属性标记为ScriptIgnore:

public class Category
{
  [ScriptIgnore]
  public int CategoryId { get; set; }
  public string CategoryName { get; set; }
}
事实上,Serialize方法是个递归方法,会递归地序列化对象的属性,因此在序列化一个复杂对象(比如DataTable)时往往会出现“循环引用”的异常,这时候就需要针对复杂类型自定义一个转换器。

下面是DataTable的转换器,原理是把DataTable转换成一个字典列表后再序列化:

/// <summary>
/// DataTable JSON转换类
/// </summary>
public class DataTableConverter : JavaScriptConverter
{
  public override IDictionary<string,object> Serialize(object obj,JavaScriptSerializer serializer)
  {
    DataTable dt = obj as DataTable;
    Dictionary<string,object> result = new Dictionary<string,object>();

    List<Dictionary<string,object>> rows = new List<Dictionary<string,object>>();

    foreach (DataRow dr in dt.Rows)
    {
      Dictionary<string,object> row = new Dictionary<string,object>();
      foreach (DataColumn dc in dt.Columns)
      {
          row.Add(dc.ColumnName,dr[dc.ColumnName]);
      }
      rows.Add(row);
    }

    result[Rows] = rows;

    return result;
  }

  public override object Deserialize(IDictionary<string,object> dictionary,Type type,JavaScriptSerializer serializer)
  {
    throw new NotImplementedException();
  }

  /// <summary>
  /// 获取本转换器支持的类型
  /// </summary>
  public override IEnumerable<Type> SupportedTypes
  {
    get { return new Type[] { typeof(DataTable) }; }
  }
}
所有自定义的转换器都要继承于JavaScriptConverter,并实现Serialize、Deserialize方法和SupportedTypes属性,其中SupportedTypes属性用于枚举此转换器支持的类型。定义了一个新的转换器后需要将其实例化并注册到JavaScriptSerializer对象:

JavaScriptSerializer JsonSerializer = new JavaScriptSerializer();
JsonSerializer.RegisterConverters(
  new JavaScriptConverter[]
  {
    new DataTableConverter()
  }
);
对于DateTime类型,JavaScriptSerializer默认将其序列化为 \/Date(ticks)\/ 格式的字符串,这明显需要Javascript作进一步的解释。

相关文章

kindeditor4.x代码高亮功能默认使用的是prettify插件,prett...
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代...
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小