近来在研究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序列化和反序列化方法
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
///
<summary>
///
Json序列化,用于发送到客户端
///
</summary>
public
static
string
ToJsJson(
this
object
item)
{
DataContractJsonSerializerserializer
=
new
DataContractJsonSerializer(item.GetType());
using
(MemoryStreamms
=
new
MemoryStream())
{
serializer.WriteObject(ms,item);
StringBuildersb
=
new
StringBuilder();
sb.Append(Encoding.UTF8.GetString(ms.ToArray()));
return
sb.ToString();
}
}
///
<summary>
///
Json反序列化,用于接收客户端Json后生成对应的对象
///
</summary>
public
static
TFromJsonTo
<
T
>
(
this
string
jsonString)
{
DataContractJsonSerializerser
=
new
DataContractJsonSerializer(
typeof
(T));
MemoryStreamms
=
new
MemoryStream(Encoding.UTF8.GetBytes(jsonString));
TjsonObject
=
(T)ser.ReadObject(ms);
ms.Close();
return
jsonObject;
}
实体类
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
[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
;}
}
--------------------------------------------javascript获取Json---------------------------------
javascript调用测试代码
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
$(
'
#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);
}
});
});
C#后台生成代码
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
public
class
getJsonHandler:IHttpHandler
{
public
void
ProcessRequest(HttpContextcontext)
{
TestObjobj
=
new
TestObj();
obj.make
=
"
MakeisValue
"
;
obj.model
=
"
ModelisValue
"
;
obj.year
=
999
;
obj.color
=
"
ColorisValue
"
;
context.Response.Write(obj.ToJsJson());
}
public
bool
IsReusable
{
get
{
return
false
;
}
}
}
//
返回值为{"color":"ColorisValue","make":"MakeisValue","model":"ModelisValue","year":999}
---------------------------------C#由Json生成对象---------------------------------------
javascript调用测试代码
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
$(
'
#postJson
'
).click(
function
(){
var
m_obj
=
{make:
"
Dodge
"
,model:
"
CoronetR/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#后台生成代码
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
public
class
postJsonHandler:IHttpHandler
{
public
void
ProcessRequest(HttpContextcontext)
{
string
jsonStr
=
context.Request[
"
postjson
"
];
TestObjobj
=
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字符串生成对象,是根据对应的名称赋值,多于或少于都不会报错.