使用JavaScriptSerializer进行JSON序列化

http://heeroluo.net/ShowArticle15.aspx

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作进一步的解释,非常多余。笔者建议各位根据需要添加一个DateTime类型的转换器。

 

 

 

 

你可能感兴趣的:(JavaScript)