1. 首先, JavascriptSerializer类所在名空间: using System.Web.Script.Serialization;

 

2. 相关的3篇文章, 标记下:

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

 

====================================

第二篇:

 

Asp.net Ajax WebService 实现循环引用(自定义JavascriptConverter)

2008-07-18 15:49 by Henry Cui, 1476 visits, 收藏, 编辑

准备技术:
    1.简单的WebService编写;
    2.了解Asp.net Ajax 客户端访问WebService


内容:
    asp.net ajax框架在去年看过,只是些基本的使用,并没有过多的去研究它的原理。最近在一个项目中要实现客户端访问WebService并返回DataTable类型的数据,当我调用一个返回DataTable的方法时,不能返回成功,在错误的回调函数中告诉我DataTable是一个循环应用类型,不能序列化。当是想过把DataTable替换成其他类型的数据如ArrayList或则Array等,可是有点心不甘,所以查过各个方面的资料,告诉我微软已经提供了一个解决DataTable的JavaScriptConverter的dll文件,当我在web.config中添加了对这个JavascriptConverter引用即可以将DataTable序列化成Json字符串了。
    好了,废话不多说了。下面就自己来做个循环应用的实例,并通过自定义JavascriptConverter来解决循环引用的问题。本文只会简单的介绍下服务器端序列化数据类型到Json的过程,不会太深入。

    首先先来定义两个类,想了半天最好的实例就是一对夫妻,一个老公只有一个老婆,这是婚姻法规定的,所以老公类型跟老婆类型就可以达到实例中的循环引用。看下两个类型的类试图:
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
其实两个类里面的内容都很简单,Husband.cs:

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverterusing System;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web.Services;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web.Services.Protocols;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.ComponentModel;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
public class Husband
    private string _firstName;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
public string FirstName
    
        get         set     }
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
private string _lastName;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
public string LastName
    
        get         set     }
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
private Wife _wife;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
public Wife Wife
    
        get         set     }
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter}

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
Wife.cs:
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverterusing System;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web.Services;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web.Services.Protocols;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.ComponentModel;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
public class Wife
    private string _firstName;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
public string FirstName
    
        get         set     }
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
private string _lastName;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
public string LastName
    
        get         set     }
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
private Husband _husband;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
public Husband Husband
    
        get         set     }
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter}

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter

然后我定义了个Webservice类用来提供Client的访问,HusbandService.cs:
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverterusing System;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Collections;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Linq;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web.Services;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web.Services.Protocols;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Xml.Linq;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web.Script.Services;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
/// Husband's Method
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
/// </summary>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter[WebService(Namespace = "http://tempuri.org/")]
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter[WebServiceBinding(ConformsTo 
= WsiProfiles.BasicProfile1_1)]
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter[ScriptService]
public class HusbandService : System.Web.Services.WebService 
    
public HusbandService () 
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        
//Uncomment the following line if using designed components 
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        
//InitializeComponent(); 
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
    }
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    [WebMethod]
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
public Husband GetHusband()
    
        Husband hansband = new Husband();
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        hansband.FirstName 
= "Henllyee";
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        hansband.LastName 
= "Cui";
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        Wife wife 
= new Wife();
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        wife.FirstName 
= "Throwen";
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        wife.LastName 
= "Yang";
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        hansband.Wife 
= wife;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        wife.Husband 
= hansband;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        
return hansband;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    }

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter}

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter

我在一个asp.net 页面中通过asp.net ajax对GetHusband()的应用的,JavascriptConverter.aspx:
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="JavascriptConverter.aspx.cs" Inherits="_Default" %>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
<html xmlns="http://www.w3.org/1999/xhtml">
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
<head runat="server">
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
<title>JavaScriptConverter Demo</title>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
</head>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
<body>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
<form id="form1" runat="server">
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
<div>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        
<asp:ScriptManager ID="scriptManager" runat="server">
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            
<Services>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter                
<asp:ServiceReference Path="~/HusbandService.asmx" />
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            
</Services>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        
</asp:ScriptManager>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        
<script language="javascript" type="text/javascript">
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter          function getServiceHasband()
          
            HusbandService.GetHusband(onSuccess,onFailed);
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter          }

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter          function onSuccess(result)
          
            alert(result.FirstName);
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter          }

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter          function onFailed(error)
          
            alert(error.get_message());
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter          }

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter          
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter          
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter          window.onload
=function()
          
            var btnGet = $get("btnGet");
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            
if(btnGet)
            
                btnGet.onclick=getServiceHasband;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            }
  
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter          }

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        
</script>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        
<input type="button" id="btnGet" value="Get HusBand" />
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
</div>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
</form>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
</body>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
</html>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
运行后当我们点击按钮是,会弹出出错的信息,告诉我们Husband是一个循环引用类型,不能序列化。这时我们可以通过编写对应的JavascriptConverter来告诉服务器端如何去序列化。

我们自定的JavascriptConverter必须继承于JavascriptConverter(JavascriptConverter参考文档),然后去重写里面的两个方法跟一个属性:
1.Deserialize:如何反序列化一个Jason到这个Converter类型;
2.Serialize:如何序列化支持的对象到一个Jason;
3.SupportedTypes:这个Converter支持的类型。
好了下面我们定义下一个Converter来支持循环引用,现在我们先定义如何将去序列化,HusbandConverter.cs:
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverterusing System;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Data;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Configuration;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Linq;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web.Security;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web.UI;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web.UI.HtmlControls;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web.UI.WebControls;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web.UI.WebControls.WebParts;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Xml.Linq;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web.Script.Serialization;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Collections.Generic;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
/// Husband's Converter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
/// </summary>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverterpublic class HusbandConverter:JavaScriptConverter
    public HusbandConverter()
    
        
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    }

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
    
    /// 
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
/// </summary>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
/// <param name="dictionary"></param>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
/// <param name="type"></param>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
/// <param name="serializer"></param>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
/// <returns></returns>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    public override object Deserialize(IDictionary<stringobject> dictionary, Type type, JavaScriptSerializer serializer)
    
        throw new NotImplementedException();
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    }

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
    
    /// Serizlize a json
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
/// </summary>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
/// <param name="obj"></param>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
/// <param name="serializer"></param>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
/// <returns></returns>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    public override IDictionary<stringobject> Serialize(object obj, JavaScriptSerializer serializer)
    
        Husband husband = (Husband)obj;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        IDictionary
<string,object> dictionary  = new Dictionary<string,object>();
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        husband.Wife.Husband 
= null;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        dictionary[
"FirstName"= husband.FirstName;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        dictionary[
"LastName"= husband.LastName;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        dictionary[
"Wife"= husband.Wife;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        
return dictionary;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    }

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
    
    /// Support Types
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
/// </summary>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    public override System.Collections.Generic.IEnumerable<Type> SupportedTypes
    
        get
        
            yield return typeof(Husband);
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        }

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    }

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter}

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter

然后我们在web.config中注册这样一段对这个Converter的引用:

 

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter<system.web.extensions>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        
<scripting>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            
<webServices>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter                
<jsonSerialization>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter                    
<converters>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter                        
<add name="HusbandConvert" type="HusbandConverter,App_Code"/>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter                    
</converters>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter                
</jsonSerialization>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            
</webServices>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        
</scripting>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
</system.web.extensions>

这下我们再运行时,去点击按钮就能返回“Henllyee”。
在上面中我们首先重写了SupportedTypes属性去告诉系统我这个Converter支持那些类型的数据。然后我们去重写了Serialize方法,其实我们在这里只是把husband.Wife.Husband设置为了null,让它不去循环引用了,所以这样就破坏原来的类的本意。但是我们可以在客户端再去完善它,再在客户端设置husband.Wife.Husband=husband即可了。
下面我们再看如何进行反序列化了。首先我们在webservice中先添加一个方法,来传入Husband对象

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter [WebMethod]
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
public string GetHusbandInfo(Husband hansband)
    
        Debug.Assert(hansband.Wife.Husband == hansband);
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        
return String.Format(
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            
"Husband's :{0}\n Wife:{1}",
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            hansband.FirstName 
+ " " + hansband.LastName,
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            hansband.Wife.FirstName 
+ " " + hansband.LastName);
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    }

然后我们再去把反序列化实现下:

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverterpublic override object Deserialize(IDictionary<stringobject> dictionary, Type type, JavaScriptSerializer serializer)
    
        Husband husband = new Husband();
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        husband.FirstName 
= (string)dictionary["FirstName"];
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        husband.LastName 
= (string)dictionary["LastName"];
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        husband.Wife 
= serializer.ConvertToType<Wife>(dictionary["Wife"]);
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        husband.Wife.Husband 
= husband;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        
return husband;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    }

最后我们在客户端进行调用:

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter  function getHusbandInfo()
          
            var husband = new Object();
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            husband.FirstName
="Henllyee";
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            husband.LastName
="Cui";
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            var wif 
= new Object();
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            wif.FirstName
="Erry";
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            wif.LastName
="Du";
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            husband.Wife
=wif;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            HusbandService.GetHusbandInfo(husband,onGetInfoSucceded,onFailed);
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter          }

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter          
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter          function onGetInfoSucceded(result)
          
            alert(result);
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter          }

具体的前台的脚本就不在给出,通过运行我们会发现反序列化是成功的。
 
=================================
第三篇:

    事情是这样的,ASP.NET AJAX调用服务器端的代码,返回一个复杂类型,GongWenList,其中GongWenList有两个属性,(1):List<GongWen>类型的ListGongWen,(2)简单的int类型的iItemCount;其中GongWen为一个 由简单类型组成的类.

这三个类结构如下:

 

 sDateTimeReceived;
        }
    }

 

然后是GongWenList类型的代码:

 

 value; }
        }
    }

 

这样我们的WebService直接返回这样的类型,当然是不能被JS所识别的

于是乎就继承JavaScriptConverter类实现了自己的转换器如下:

 

.m_supportTypes; }
        }
    }

准备技术:
    1.简单的WebService编写;
    2.了解Asp.net Ajax 客户端访问WebService


内容:
    asp.net ajax框架在去年看过,只是些基本的使用,并没有过多的去研究它的原理。最近在一个项目中要实现客户端访问WebService并返回DataTable类型的数据,当我调用一个返回DataTable的方法时,不能返回成功,在错误的回调函数中告诉我DataTable是一个循环应用类型,不能序列化。当是想过把DataTable替换成其他类型的数据如ArrayList或则Array等,可是有点心不甘,所以查过各个方面的资料,告诉我微软已经提供了一个解决DataTable的JavaScriptConverter的dll文件,当我在web.config中添加了对这个JavascriptConverter引用即可以将DataTable序列化成Json字符串了。
    好了,废话不多说了。下面就自己来做个循环应用的实例,并通过自定义JavascriptConverter来解决循环引用的问题。本文只会简单的介绍下服务器端序列化数据类型到Json的过程,不会太深入。

    首先先来定义两个类,想了半天最好的实例就是一对夫妻,一个老公只有一个老婆,这是婚姻法规定的,所以老公类型跟老婆类型就可以达到实例中的循环引用。看下两个类型的类试图:
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
其实两个类里面的内容都很简单,Husband.cs:

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverterusing System;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web.Services;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web.Services.Protocols;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.ComponentModel;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
public class Husband
    private string _firstName;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
public string FirstName
    
        get         set     }
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
private string _lastName;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
public string LastName
    
        get         set     }
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
private Wife _wife;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
public Wife Wife
    
        get         set     }
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter}

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
Wife.cs:
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverterusing System;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web.Services;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web.Services.Protocols;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.ComponentModel;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
public class Wife
    private string _firstName;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
public string FirstName
    
        get         set     }
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
private string _lastName;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
public string LastName
    
        get         set     }
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
private Husband _husband;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
public Husband Husband
    
        get         set     }
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter}

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter

然后我定义了个Webservice类用来提供Client的访问,HusbandService.cs:
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverterusing System;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Collections;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Linq;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web.Services;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web.Services.Protocols;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Xml.Linq;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web.Script.Services;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
/// Husband's Method
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
/// </summary>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter[WebService(Namespace = "http://tempuri.org/")]
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter[WebServiceBinding(ConformsTo 
= WsiProfiles.BasicProfile1_1)]
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter[ScriptService]
public class HusbandService : System.Web.Services.WebService 
    
public HusbandService () 
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        
//Uncomment the following line if using designed components 
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        
//InitializeComponent(); 
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
    }
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    [WebMethod]
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
public Husband GetHusband()
    
        Husband hansband = new Husband();
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        hansband.FirstName 
= "Henllyee";
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        hansband.LastName 
= "Cui";
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        Wife wife 
= new Wife();
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        wife.FirstName 
= "Throwen";
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        wife.LastName 
= "Yang";
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        hansband.Wife 
= wife;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        wife.Husband 
= hansband;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        
return hansband;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    }

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter}

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter

我在一个asp.net 页面中通过asp.net ajax对GetHusband()的应用的,JavascriptConverter.aspx:
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="JavascriptConverter.aspx.cs" Inherits="_Default" %>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
<html xmlns="http://www.w3.org/1999/xhtml">
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
<head runat="server">
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
<title>JavaScriptConverter Demo</title>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
</head>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
<body>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
<form id="form1" runat="server">
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
<div>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        
<asp:ScriptManager ID="scriptManager" runat="server">
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            
<Services>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter                
<asp:ServiceReference Path="~/HusbandService.asmx" />
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            
</Services>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        
</asp:ScriptManager>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        
<script language="javascript" type="text/javascript">
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter          function getServiceHasband()
          
            HusbandService.GetHusband(onSuccess,onFailed);
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter          }

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter          function onSuccess(result)
          
            alert(result.FirstName);
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter          }

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter          function onFailed(error)
          
            alert(error.get_message());
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter          }

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter          
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter          
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter          window.onload
=function()
          
            var btnGet = $get("btnGet");
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            
if(btnGet)
            
                btnGet.onclick=getServiceHasband;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            }
  
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter          }

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        
</script>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        
<input type="button" id="btnGet" value="Get HusBand" />
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
</div>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
</form>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
</body>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
</html>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
运行后当我们点击按钮是,会弹出出错的信息,告诉我们Husband是一个循环引用类型,不能序列化。这时我们可以通过编写对应的JavascriptConverter来告诉服务器端如何去序列化。

我们自定的JavascriptConverter必须继承于JavascriptConverter(JavascriptConverter参考文档),然后去重写里面的两个方法跟一个属性:
1.Deserialize:如何反序列化一个Jason到这个Converter类型;
2.Serialize:如何序列化支持的对象到一个Jason;
3.SupportedTypes:这个Converter支持的类型。
好了下面我们定义下一个Converter来支持循环引用,现在我们先定义如何将去序列化,HusbandConverter.cs:
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverterusing System;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Data;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Configuration;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Linq;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web.Security;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web.UI;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web.UI.HtmlControls;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web.UI.WebControls;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web.UI.WebControls.WebParts;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Xml.Linq;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Web.Script.Serialization;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
using System.Collections.Generic;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
/// Husband's Converter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
/// </summary>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverterpublic class HusbandConverter:JavaScriptConverter
    public HusbandConverter()
    
        
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    }

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
    
    /// 
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
/// </summary>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
/// <param name="dictionary"></param>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
/// <param name="type"></param>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
/// <param name="serializer"></param>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
/// <returns></returns>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    public override object Deserialize(IDictionary<stringobject> dictionary, Type type, JavaScriptSerializer serializer)
    
        throw new NotImplementedException();
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    }

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
    
    /// Serizlize a json
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
/// </summary>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
/// <param name="obj"></param>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
/// <param name="serializer"></param>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
/// <returns></returns>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    public override IDictionary<stringobject> Serialize(object obj, JavaScriptSerializer serializer)
    
        Husband husband = (Husband)obj;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        IDictionary
<string,object> dictionary  = new Dictionary<string,object>();
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        husband.Wife.Husband 
= null;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        dictionary[
"FirstName"= husband.FirstName;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        dictionary[
"LastName"= husband.LastName;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        dictionary[
"Wife"= husband.Wife;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        
return dictionary;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    }

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
    
    /// Support Types
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
/// </summary>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    public override System.Collections.Generic.IEnumerable<Type> SupportedTypes
    
        get
        
            yield return typeof(Husband);
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        }

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    }

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter}

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter

然后我们在web.config中注册这样一段对这个Converter的引用:

 

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter<system.web.extensions>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        
<scripting>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            
<webServices>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter                
<jsonSerialization>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter                    
<converters>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter                        
<add name="HusbandConvert" type="HusbandConverter,App_Code"/>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter                    
</converters>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter                
</jsonSerialization>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            
</webServices>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        
</scripting>
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
</system.web.extensions>

这下我们再运行时,去点击按钮就能返回“Henllyee”。
在上面中我们首先重写了SupportedTypes属性去告诉系统我这个Converter支持那些类型的数据。然后我们去重写了Serialize方法,其实我们在这里只是把husband.Wife.Husband设置为了null,让它不去循环引用了,所以这样就破坏原来的类的本意。但是我们可以在客户端再去完善它,再在客户端设置husband.Wife.Husband=husband即可了。
下面我们再看如何进行反序列化了。首先我们在webservice中先添加一个方法,来传入Husband对象

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter [WebMethod]
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    
public string GetHusbandInfo(Husband hansband)
    
        Debug.Assert(hansband.Wife.Husband == hansband);
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        
return String.Format(
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            
"Husband's :{0}\n Wife:{1}",
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            hansband.FirstName 
+ " " + hansband.LastName,
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            hansband.Wife.FirstName 
+ " " + hansband.LastName);
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    }

然后我们再去把反序列化实现下:

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverterpublic override object Deserialize(IDictionary<stringobject> dictionary, Type type, JavaScriptSerializer serializer)
    
        Husband husband = new Husband();
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        husband.FirstName 
= (string)dictionary["FirstName"];
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        husband.LastName 
= (string)dictionary["LastName"];
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        husband.Wife 
= serializer.ConvertToType<Wife>(dictionary["Wife"]);
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        husband.Wife.Husband 
= husband;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter        
return husband;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter    }

最后我们在客户端进行调用:

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter  function getHusbandInfo()
          
            var husband = new Object();
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            husband.FirstName
="Henllyee";
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            husband.LastName
="Cui";
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            var wif 
= new Object();
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            wif.FirstName
="Erry";
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            wif.LastName
="Du";
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            husband.Wife
=wif;
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter            HusbandService.GetHusbandInfo(husband,onGetInfoSucceded,onFailed);
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter          }

利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter          
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter          function onGetInfoSucceded(result)
          
            alert(result);
利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
    




一个JavaScriptConverter          }

具体的前台的脚本就不在给出,通过运行我们会发现反序列化是成功的。

    事情是这样的,ASP.NET AJAX调用服务器端的代码,返回一个复杂类型,GongWenList,其中GongWenList有两个属性,(1):List<GongWen>类型的ListGongWen,(2)简单的int类型的iItemCount;其中GongWen为一个 由简单类型组成的类.

这三个类结构如下:

 

 sDateTimeReceived;
        }
    }

 

然后是GongWenList类型的代码:

 

 value; }
        }
    }

 

这样我们的WebService直接返回这样的类型,当然是不能被JS所识别的

于是乎就继承JavaScriptConverter类实现了自己的转换器如下:

 

.m_supportTypes; }
        }
    }

相关文章: