.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的支持。

简单示例

在本文中我们仍然采用前面两篇文章中用过的显示最新随笔这样一个示例(举一反三嘛:)),最终完成的效果如下图所示:ITPUB个人空间9S;s@+r~r

g*J0c!pz,s0

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

public classPostITPUB个人空间T7P,Ph2Sg%`w
{
S{.W5cC2zNP0public intId {get;set; }ITPUB个人空间(Tr:s'?0R Qw1O

e7d j.l~+S7@%y0public stringTitle {get;set; }ITPUB个人空间kv"W sD$sh

%F~#RE/^Sj \0public stringAuthor {get;set; }
X0n6q(m*_ K I0}
public classBlog
? of~+I/f7\9kX0
{ITPUB个人空间`'H"m;sH
publicList<Post> Posts {get;set; }ITPUB个人空间"{8m!\4OE+l
}

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

public classBlogHandler:IHttpHandler
[/K;x*x%]v3[U'S9`V0
{
\*egnbD'ygW,W9q0
(K"F:Qe2e#y!B})u"[0public voidProcessRequest(HttpContextcontext)
$k/eExo#f_ae0{ITPUB个人空间y"] }hk*IR)Aif,W
context.Response.ContentType ="text/plain";ITPUB个人空间.uy&Td]rQO
ITPUB个人空间C:J z6i]@D J;?
List<Post> posts =newList<Post>()
v6UB2QS M5?1LM2S/r W0{ITPUB个人空间VT^(|'sF#M??-O
newPost{ Id=1, Title="一步一步学Silverlight 2系列(13):数据与通信之WebRequest", Author="TerryLee"},ITPUB个人空间N j,{ }d"L&jx*m
newPost{ Id=2, Title="一步一步学Silverlight 2系列(12):数据与通信之WebClient", Author="TerryLee"},ITPUB个人空间;E:nAD&GB.Y
newPost{ Id=3, Title="一步一步学Silverlight 2系列(11):数据绑定", Author="TerryLee"},ITPUB个人空间%Jwo1l$f/m9@
newPost{ Id=4, Title="一步一步学Silverlight 2系列(10):使用用户控件", Author="TerryLee"},ITPUB个人空间u F1m i%l7FP)v J!{C
newPost{ Id=5, Title="一步一步学Silverlight 2系列(9):使用控件模板", Author="TerryLee"},
L,C6yw Twam0newPost{ Id=6, Title="一步一步学Silverlight 2系列(8):使用样式封装控件观感", Author="TerryLee"}ITPUB个人空间`?!l*{-T w&I*z
};
D*]Y7p"lc"H4G0ITPUB个人空间;Kul}mw+xB
Blogblog =newBlog();ITPUB个人空间*LIo;q2i
blog.Posts = posts;
f;q W ObW5o/~L _0ITPUB个人空间"Z,_.U @9Tw
context.Response.Write(JavaScriptConvert.SerializeObject(blog));
G8_ tvv(OU]4ng0}
(Bs"S0M+o:\#K0
:xi/CuoE[0ct&v x0public boolIsReusableITPUB个人空间 VqS%kxM
{ITPUB个人空间f1s}R4FG3Hg K
get
v o D0?qn&Da0
{ITPUB个人空间Gm+];S yk
return false;ITPUB个人空间+Fw^Y%?
}ITPUB个人空间}/K'vX!cpE5s$b
}
u:v*E^2t*qZ)am-z1`0}

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

ITPUB个人空间,V(t9Mz oUXd|p u(u
对这些数据格式化一下,看起来更明显,这里推荐一个在线JSON数据格式化工具http://www.curiousconcept.com/jsonformatter/
Bc$V|8xY0ITPUB个人空间.Tog|,Y$Z;_ L
格式化后的数据如下:
VP-@j2} [R0ITPUB个人空间B;@:z/`8E9w

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

我们使用WebRequest获取数据:

private voidUserControl_Loaded(objectsender,RoutedEventArgse)
jC/N2In-hf6vu0{ITPUB个人空间*n*w)B+[6V
Uriendpoint =newUri("http://localhost:8081/BlogHandler.ashx");
au,R*j w/|~0
Y2[;i h-C j0WebRequestrequest =WebRequest.Create(endpoint);
5]9h jH$`t)dW0request.Method ="POST";ITPUB个人空间,E5c\*yZ2V3cm
request.ContentType ="application/x-www-form-urlencoded";
G-x} \C"E7R0request.BeginGetResponse(newAsyncCallback(ResponseReady), request);ITPUB个人空间(A5j mVbP _Z9N@
}ITPUB个人空间C)z$xH$uk J K

R3@ n+S(~!S B-sF)f:Z0voidResponseReady(IAsyncResultasyncResult)ITPUB个人空间 ALhX#Ik,a7sE
{
5K/|Y3\A$?m H0WebRequestrequest = asyncResult.AsyncStateasWebRequest;ITPUB个人空间2D5g,[ v9w4W
WebResponseresponse = request.EndGetResponse(asyncResult);
:V+`8w@:y uj:J0
G/x0C {-~3ttu.G0using(StreamresponseStream = response.GetResponseStream())ITPUB个人空间rE@M6RQ J
{ITPUB个人空间.O(Dq$W/tR'_:E b
DataContractJsonSerializerjsonSerializer =newDataContractJsonSerializer(typeof(Blog));
ZEqa-h3c$Y0ITPUB个人空间E'H`!r1N
Blogblog = jsonSerializer.ReadObject(responseStream)asBlog;
F*NA5V~/i0ITPUB个人空间5V/Tz![{^ i;Z(zG@
Posts.ItemsSource = blog.Posts;
;?k(d0m/vB0}
&?'\kT#CMR)k0}

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


"Q_^/Pa%y ]0至此一个完整的在Silverlight 2对于JSON的支持示例就完成了。运行后的效果与前面的示例一样:ITPUB个人空间0aK%l$w#{XV
ITPUB个人空间;t%[V;\(K5n

结束语

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

作者:TerryLee
-A9D6l[1L+|#i0出处:http://terrylee.cnblogs.com
ITPUB个人空间Shu Y gV7J?7_&V}

TAG:

 

评分:0

我来说两句

显示全部

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

日历

« 2012-02-10  
   1234
567891011
12131415161718
19202122232425
26272829   

数据统计

  • 访问量: 665817
  • 日志数: 3733
  • 影音数: 7
  • 文件数: 1
  • 建立时间: 2008-01-04
  • 更新时间: 2010-12-31

RSS订阅

Open Toolbar