近来在研究jQuery,用$.ajax在与后台交换数据时用到Json格式,后台与前台序列化和反序列化方法研究了很久才成功,发文共享.
前台调用的JS文件需要用到jQuery-1.2.6.js和json2.js(http://www.json.org/json2.js),后台引用空间System.Runtime.Serialization和System.Runtime.Serialization.Json
Json序列化和反序列化方法
///
<summary>
/// Json序列化,用于发送到客户端
/// </summary>
public static string ToJsJson( this object item)
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(item.GetType());
using (MemoryStream ms = new MemoryStream())
{
serializer.WriteObject(ms, item);
StringBuilder sb = new StringBuilder();
sb.Append(Encoding.UTF8.GetString(ms.ToArray()));
return sb.ToString();
}
}
/// <summary>
/// Json反序列化,用于接收客户端Json后生成对应的对象
/// </summary>
public static T FromJsonTo < T > ( this string jsonString)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer( typeof (T));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
T jsonObject = (T)ser.ReadObject(ms);
ms.Close();
return jsonObject;
}
/// Json序列化,用于发送到客户端
/// </summary>
public static string ToJsJson( this object item)
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(item.GetType());
using (MemoryStream ms = new MemoryStream())
{
serializer.WriteObject(ms, item);
StringBuilder sb = new StringBuilder();
sb.Append(Encoding.UTF8.GetString(ms.ToArray()));
return sb.ToString();
}
}
/// <summary>
/// Json反序列化,用于接收客户端Json后生成对应的对象
/// </summary>
public static T FromJsonTo < T > ( this string jsonString)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer( typeof (T));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
T jsonObject = (T)ser.ReadObject(ms);
ms.Close();
return jsonObject;
}
实体类
[DataContract]
public class TestObj
{
[DataMember]
public string make { get ; set ; }
[DataMember]
public string model { get ; set ; }
[DataMember]
public int year { get ; set ; }
[DataMember]
public string color { get ; set ; }
}
public class TestObj
{
[DataMember]
public string make { get ; set ; }
[DataMember]
public string model { get ; set ; }
[DataMember]
public int year { get ; set ; }
[DataMember]
public string color { get ; set ; }
}
--------------------------------------------javascript获取Json---------------------------------
javascript调用测试代码
$(
'
#getJson
'
).click(
function
() {
$.ajax({
url: " getJsonHandler.ashx " ,
type: ' GET ' ,
data: {},
dataType: ' json ' ,
timeout: 1000 ,
error: function (XMLHttpRequest, textStatus, errorThrown) { alert(textStatus) },
success: function (result) {
alert(result.make);
alert(result.model);
alert(result.year);
alert(result.color);
}
});
});
$.ajax({
url: " getJsonHandler.ashx " ,
type: ' GET ' ,
data: {},
dataType: ' json ' ,
timeout: 1000 ,
error: function (XMLHttpRequest, textStatus, errorThrown) { alert(textStatus) },
success: function (result) {
alert(result.make);
alert(result.model);
alert(result.year);
alert(result.color);
}
});
});
C#后台生成代码
public
class
getJsonHandler: IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
TestObj obj = new TestObj();
obj.make = " Make is Value " ;
obj.model = " Model is Value " ;
obj.year = 999 ;
obj.color = " Color is Value " ;
context.Response.Write(obj.ToJsJson());
}
public bool IsReusable
{
get
{
return false ;
}
}
}
// 返回值为 {"color":"Color is Value","make":"Make is Value","model":"Model is Value","year":999}
{
public void ProcessRequest(HttpContext context)
{
TestObj obj = new TestObj();
obj.make = " Make is Value " ;
obj.model = " Model is Value " ;
obj.year = 999 ;
obj.color = " Color is Value " ;
context.Response.Write(obj.ToJsJson());
}
public bool IsReusable
{
get
{
return false ;
}
}
}
// 返回值为 {"color":"Color is Value","make":"Make is Value","model":"Model is Value","year":999}
---------------------------------C#由Json生成对象---------------------------------------
javascript调用测试代码
$(
'
#postJson
'
).click(
function
() {
var m_obj = { make: " Dodge " , model: " Coronet R/T " , year: 1968 , color: " yellow " };
var jsonStr = JSON.stringify(m_obj); // 用Json2.js生成Json字符串
$.ajax({
url: " postJsonHandler.ashx " ,
type: ' POST ' ,
data: { postjson: jsonStr },
dataType: ' json ' ,
timeout: 1000 ,
error: function (XMLHttpRequest, textStatus, errorThrown) { alert(textStatus) },
success: function (result) {
alert(result.success);
}
});
});
var m_obj = { make: " Dodge " , model: " Coronet R/T " , year: 1968 , color: " yellow " };
var jsonStr = JSON.stringify(m_obj); // 用Json2.js生成Json字符串
$.ajax({
url: " postJsonHandler.ashx " ,
type: ' POST ' ,
data: { postjson: jsonStr },
dataType: ' json ' ,
timeout: 1000 ,
error: function (XMLHttpRequest, textStatus, errorThrown) { alert(textStatus) },
success: function (result) {
alert(result.success);
}
});
});
C#后台生成代码
public
class
postJsonHandler: IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
string jsonStr = context.Request[ " postjson " ];
TestObj obj = jsonStr.FromJsonTo < TestObj > ();
if ( string .IsNullOrEmpty(obj.make) || string .IsNullOrEmpty(obj.model) || string .IsNullOrEmpty(obj.color)
|| obj.year < 0 )
{
context.Response.Write( " {success:false} " );
}
else
{
context.Response.Write( " {success:true} " );
}
public bool IsReusable
{
get
{
return false ;
}
}
}
{
public void ProcessRequest(HttpContext context)
{
string jsonStr = context.Request[ " postjson " ];
TestObj obj = jsonStr.FromJsonTo < TestObj > ();
if ( string .IsNullOrEmpty(obj.make) || string .IsNullOrEmpty(obj.model) || string .IsNullOrEmpty(obj.color)
|| obj.year < 0 )
{
context.Response.Write( " {success:false} " );
}
else
{
context.Response.Write( " {success:true} " );
}
public bool IsReusable
{
get
{
return false ;
}
}
}
使用Json时需要注意,服务器端拼凑生成Json字符串时,一定要注意把字符串用/"/"包裹,不然客户端接收时肯定会报错,根据Json字符串生成对象,是根据对应的名称赋值,多于或少于都不会报错.