今天我们来探讨一下关于 使用JavaScriptSerializer的Serialize方法进行Json序列化.
在这里我们要用到反射,所以,对于反射也可以顺便学习一下.
注意,我这里是用Vs2008来编写的,所以Vs2008以前的版本,需要读者自己相应的改一下,~_~!
首先我们创建一个webapplication工程,
添加一个WebService.htm文件,
页面代码如下:
<!
DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
< html xmlns ="http://www.w3.org/1999/xhtml" >
< head >
< title > 无标题页 </ title >
< script src ="ExtJs/ext-base.js" type ="text/javascript" ></ script >
< script src ="ExtJs/ext-all.js" type ="text/javascript" ></ script >
</ head >
< body >
< input id ="Button1" onclick ="getValue();" type ="button" value ="返回" />
< textarea id ="log" cols ="40" rows ="10" ></ textarea >
< script type ="text/javascript" > ...
<!--
function getValue()
...{
Ext.Ajax.request(
...{
method:"post",
url:"test.asmx/GetData",
success:ExtSuccess,
headers:...{'Content-Type':'application/json;utf-8'}//在这里一定要指定头信息为json,否则将返回的是XML,而不是Json
}
)
}
function ExtSuccess(result,request)
...{
var textArea = Ext.get('log').dom;
textArea.value += result.responseText + " ";
//Ext.MessageBox.alert('Success', 'Data return from the server: '+ result.responseText);
doJSON(result.responseText);
}
function doJSON(stringData) ...{
try ...{
//这里可能麻烦一点,需要将返回的数据进行两次Json序列化
//第二次转化的对象是stringData.d, d是ExtJs内部定义的属性
var jsonData = Ext.util.JSON.decode(stringData);
jsonData = Ext.util.JSON.decode(jsonData.d);
for(var i in jsonData)
...{
alert(i+":"+jsonData[i]);
}
}
catch (err) ...{
}
}
//-->
</ script >
</ body >
</ html >
< html xmlns ="http://www.w3.org/1999/xhtml" >
< head >
< title > 无标题页 </ title >
< script src ="ExtJs/ext-base.js" type ="text/javascript" ></ script >
< script src ="ExtJs/ext-all.js" type ="text/javascript" ></ script >
</ head >
< body >
< input id ="Button1" onclick ="getValue();" type ="button" value ="返回" />
< textarea id ="log" cols ="40" rows ="10" ></ textarea >
< script type ="text/javascript" > ...
<!--
function getValue()
...{
Ext.Ajax.request(
...{
method:"post",
url:"test.asmx/GetData",
success:ExtSuccess,
headers:...{'Content-Type':'application/json;utf-8'}//在这里一定要指定头信息为json,否则将返回的是XML,而不是Json
}
)
}
function ExtSuccess(result,request)
...{
var textArea = Ext.get('log').dom;
textArea.value += result.responseText + " ";
//Ext.MessageBox.alert('Success', 'Data return from the server: '+ result.responseText);
doJSON(result.responseText);
}
function doJSON(stringData) ...{
try ...{
//这里可能麻烦一点,需要将返回的数据进行两次Json序列化
//第二次转化的对象是stringData.d, d是ExtJs内部定义的属性
var jsonData = Ext.util.JSON.decode(stringData);
jsonData = Ext.util.JSON.decode(jsonData.d);
for(var i in jsonData)
...{
alert(i+":"+jsonData[i]);
}
}
catch (err) ...{
}
}
//-->
</ script >
</ body >
</ html >
然后我们加入要引用的ext-base.js和ext-all.js两个ExtJs文件,这两个文件需要读者到www.extjs.com去下载.
接下来我们创建一个test.asmx文件,代码如下:
using
System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;
using System.Web.Script.Services;
using System.Collections.Generic;
using System.ServiceModel.Web;
using System.ServiceModel.Dispatcher;
using Component;
namespace WebApplication1
... {
/**//// <summary>
/// test 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
[ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
public class test : System.Web.Services.WebService
...{
[WebMethod]
public string GetData()
...{
var obj = new ...{ obj = new[] ...{ new ...{ name = "a", id = 1 }, new ...{ name = "b", id = 2 } } };
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("p1",1);
dic.Add("p2",2);
return obj.toJson(new ...{ p1 = 1 }, new ...{ p2 = 2 });
}
}
}
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;
using System.Web.Script.Services;
using System.Collections.Generic;
using System.ServiceModel.Web;
using System.ServiceModel.Dispatcher;
using Component;
namespace WebApplication1
... {
/**//// <summary>
/// test 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
[ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
public class test : System.Web.Services.WebService
...{
[WebMethod]
public string GetData()
...{
var obj = new ...{ obj = new[] ...{ new ...{ name = "a", id = 1 }, new ...{ name = "b", id = 2 } } };
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("p1",1);
dic.Add("p2",2);
return obj.toJson(new ...{ p1 = 1 }, new ...{ p2 = 2 });
}
}
}
接下来创建一个ExtendMethod.cs文件,存放Json序列化的扩展方法
using
System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Script.Serialization;
using System.Collections;
using System.Reflection;
namespace Component
... {
public static class ExtendMethod
...{
/**//// <summary>
/// 返回Json序列
/// parms字典
/// Key:Json对象名
/// Value:Json对象值
/// </summary>
/// <param name="This"></param>
/// <param name="parms">需要加入的对象</param>
/// <returns></returns>
public static string toJson(this object This,Dictionary<string,object> parms)
...{
JavaScriptSerializer json = new JavaScriptSerializer();
var ds = new ...{ source=This};
Dictionary<object,object> dic = new Dictionary<object,object>();
dic.Add("source",This);
foreach (KeyValuePair<string, object> key in parms)
...{
dic.Add(key.Key,key.Value);
}
return json.Serialize(dic);
}
/**//// <summary>
/// 返回Json序列
/// parms:加入的对象将与this对象同级
/// 未完成
/// </summary>
/// <param name="This"></param>
/// <param name="parms">需要加入的对象</param>
/// <returns></returns>
public static string toJson(this object This, params object[] parms)
...{
JavaScriptSerializer json = new JavaScriptSerializer();
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("source", This);
foreach (object i in parms)
...{
Type t = i.GetType();
PropertyInfo[] myproperties = t.GetProperties();
dic.Add(myproperties[0].Name, myproperties[0].GetValue(i, null));
}
return json.Serialize(dic);
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Script.Serialization;
using System.Collections;
using System.Reflection;
namespace Component
... {
public static class ExtendMethod
...{
/**//// <summary>
/// 返回Json序列
/// parms字典
/// Key:Json对象名
/// Value:Json对象值
/// </summary>
/// <param name="This"></param>
/// <param name="parms">需要加入的对象</param>
/// <returns></returns>
public static string toJson(this object This,Dictionary<string,object> parms)
...{
JavaScriptSerializer json = new JavaScriptSerializer();
var ds = new ...{ source=This};
Dictionary<object,object> dic = new Dictionary<object,object>();
dic.Add("source",This);
foreach (KeyValuePair<string, object> key in parms)
...{
dic.Add(key.Key,key.Value);
}
return json.Serialize(dic);
}
/**//// <summary>
/// 返回Json序列
/// parms:加入的对象将与this对象同级
/// 未完成
/// </summary>
/// <param name="This"></param>
/// <param name="parms">需要加入的对象</param>
/// <returns></returns>
public static string toJson(this object This, params object[] parms)
...{
JavaScriptSerializer json = new JavaScriptSerializer();
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("source", This);
foreach (object i in parms)
...{
Type t = i.GetType();
PropertyInfo[] myproperties = t.GetProperties();
dic.Add(myproperties[0].Name, myproperties[0].GetValue(i, null));
}
return json.Serialize(dic);
}
}
}
以上就是全部的代码,至于其用法在注释中已写清楚了.