zoukankan      html  css  js  c++  java
  • 使用JavaScriptSerializer进行JSON序列化

    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类型的转换器。

  • 相关阅读:
    7-31 jmu-分段函数l (20 分)
    7-29 jmu-python-不同进制数 (10 分)
    7-28 摄氏温度转换华氏温度 (5 分)
    7-23 图的字典表示 (20 分)
    7-24 判断素数 (20 分)
    7-22 输出10个不重复的英文字母 (50 分)
    【转载】C#批量插入数据到Sqlserver中的三种方式
    天气预报api-汇总
    【转载】VS2015 + EF6连接MYSQL5.6
    【转摘】TFS上分支和标签的用法
  • 原文地址:https://www.cnblogs.com/everyone/p/2873078.html
Copyright © 2011-2022 走看看