.NEt专家博客!

【李会军】一步一步学Silverlight 2系列(16):数据与通信之JSON

上一篇 / 下一篇  2008-04-11 20:11:03

概述

Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, Ironpython,对JSON、Web Service、WCF以及Sockets的支持等一系列新的特性。《一步一步学Silverlight 2系列》文章带您快速进入Silverlight 2开发。

本文将简单介绍在Silverlight 2中对于JSON的支持。

简单示例

在本文中我们仍然采用前面两篇文章中用过的显示最新随笔这样一个示例(举一反三嘛:)),最终完成的效果如下图所示:
'}1u!qCq q H"N N#Y0
K3Z0^|&IsFU0@0

首先我们建立服务端,以便能够提供JSON格式的数据。在这里为了产生JSON格式的数据,我们借助于一个开源项目Json.NET。建立两个实体类型:

public classPostITPUB个人空间4TcZ)]5w4h)P
{
pG.G'fP%p W1h-q0public intId {get;set; }
2} j N&aH"uRKa/K0
#w7DC b'J0public stringTitle {get;set; }ITPUB个人空间t:HSqq"[+K)g
ITPUB个人空间)V J7Y;Zy$M v-Bc
public stringAuthor {get;set; }
uk5eJ {0e e;y9Yx^0}
public classBlog
ov2dY}:D0
{
"V?1^'c-H0publicList<Post> Posts {get;set; }
_ Q ]8nE0}

在Silverlight项目中我们也会使用到这两个实体类,新建一个HttpHandler,产生JSON格式数据,我们使用Json.NET中的JavaScriptConvert.SerializeObject方法即可序列化一个对象为JSON格式:

public classBlogHandler:IHttpHandler
-H-`3c2tuX0{&g4H0
{ITPUB个人空间S1oQ:j3Xg i^2tGp

t3M[ yJ2T9j0public voidProcessRequest(HttpContextcontext)ITPUB个人空间B:a"X"X9OUO~;aY
{ITPUB个人空间 zrl^.Lknf\` W2S
context.Response.ContentType ="text/plain";
P!nDq3W|0ITPUB个人空间:dbM I{ P9yU
List<Post> posts =newList<Post>()ITPUB个人空间5Db\{5O*R+Y:[3? n
{ITPUB个人空间meA/M ~vW,U(B
newPost{ Id=1, Title="一步一步学Silverlight 2系列(13):数据与通信之WebRequest", Author="TerryLee"},ITPUB个人空间LG-BO wze`
newPost{ Id=2, Title="一步一步学Silverlight 2系列(12):数据与通信之WebClient", Author="TerryLee"},ITPUB个人空间"hto$B!hbc
newPost{ Id=3, Title="一步一步学Silverlight 2系列(11):数据绑定", Author="TerryLee"},
c9l y-c(Z)c3Kg0qa0newPost{ Id=4, Title="一步一步学Silverlight 2系列(10):使用用户控件", Author="TerryLee"},ITPUB个人空间V]3W!l e$hmr
newPost{ Id=5, Title="一步一步学Silverlight 2系列(9):使用控件模板", Author="TerryLee"},
l D'Q!X Lx)?)NB0newPost{ Id=6, Title="一步一步学Silverlight 2系列(8):使用样式封装控件观感", Author="TerryLee"}ITPUB个人空间 T{$V6Z8@3BFu
};
4{)S_ R jF^0ITPUB个人空间B\ml6d E$aUpv
Blogblog =newBlog();ITPUB个人空间:I |/c$GQ5_4K|
blog.Posts = posts;
['T/CIcL0
+j5_1A&{[0context.Response.Write(JavaScriptConvert.SerializeObject(blog));
@1g5C}$Bi*}0}
4h;\3B(w:[ i:X0ITPUB个人空间/pSg"v6r
public boolIsReusableITPUB个人空间$cE)^m5k*O@}bT/yW
{
:{5n6fb O2p!D0get
'\+tl o[+H0
{
[nOaYv2Gr\7`0return false;ITPUB个人空间3s9}~J V)J:TS
}
jH_[S)uA+t"E0}ITPUB个人空间Io*P ZLk#b2r
}

现在测试一下HttpHandler,查看一下生成的数据格式:


&j Tm1d?y bkpj'kD0对这些数据格式化一下,看起来更明显,这里推荐一个在线JSON数据格式化工具http://www.curiousconcept.com/jsonformatter/ITPUB个人空间J_%[6pxL7r\#Kh T
ITPUB个人空间Q0o;a*f P(R"v+N |#_
格式化后的数据如下:ITPUB个人空间U Z/D*U6Gr
ITPUB个人空间0}![T#C0O@v8d

现在实现在Silverlight中获取JSON数据,并进行反序列化,界面布局XAML就不再贴出来了,跟前面两篇的示例一样。在 Silverlight 2中,内置了对于JSON的支持,通过命名空间System.Runtime.Serialization.Json提供,位于 System.ServiceModel.Web.dll中。

我们使用WebRequest获取数据:

private voidUserControl_Loaded(objectsender,RoutedEventArgse)ITPUB个人空间Z@7Wwl8h|
{
Uy$U @ ]'LEqV,JQ0Uriendpoint =newUri("http://localhost:8081/BlogHandler.ashx");ITPUB个人空间P__@U{&S M
ITPUB个人空间2zq#X#|2Qm$jA
WebRequestrequest =WebRequest.Create(endpoint);
Sy[s3h S8W7`(k[0request.Method ="POST";ITPUB个人空间*ivCt KD4GU
request.ContentType ="application/x-www-form-urlencoded";ITPUB个人空间"qGs\bI rQ
request.BeginGetResponse(newAsyncCallback(ResponseReady), request);ITPUB个人空间o]YP5_C:L:\
}ITPUB个人空间z-A? Id4b A~,@

5|y d?Uqp0B5g0voidResponseReady(IAsyncResultasyncResult)ITPUB个人空间+c ?$Rd"y
{ITPUB个人空间'ifhNC v(O;L^
WebRequestrequest = asyncResult.AsyncStateasWebRequest;ITPUB个人空间`9U'lt2v9r+zjl8v(R
WebResponseresponse = request.EndGetResponse(asyncResult);ITPUB个人空间/GTyaF2E,KN PL4I

9i_:EpF GX};XJ0using(StreamresponseStream = response.GetResponseStream())ITPUB个人空间Z.F2mY s&h b4r
{
(t]g eW_(fIrL m0DataContractJsonSerializerjsonSerializer =newDataContractJsonSerializer(typeof(Blog));ITPUB个人空间 {]"O2P^
ITPUB个人空间5qh? Z9{)Rh%S,dQ
Blogblog = jsonSerializer.ReadObject(responseStream)asBlog;
'd'g!lt2k0ITPUB个人空间-dV ?lSv
Posts.ItemsSource = blog.Posts;
K6T&x6lv5m0}
(c2p6}|NA:A4Gxk0}

DataContractJsonSerializer用于将对象序列化为JSON或者反序列化为对象实例,分别使用方法WriteObject和ReadObject。

ITPUB个人空间^2`x [$jl
至此一个完整的在Silverlight 2对于JSON的支持示例就完成了。运行后的效果与前面的示例一样:ITPUB个人空间|2~E+{vL
ITPUB个人空间3G.tO*}`z

结束语

本文简单介绍了在Silverlight 2中对于JSON的支持,DataContractJsonSerializer用于将对象序列化为JSON或者反序列化为对象实例,你可以从这里下载本文示例代码。

作者:TerryLee
Q5RF#V4U0出处:http://terrylee.cnblogs.com
ITPUB个人空间2O5X-[#H'j'hW

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar