概述
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个人空间_
lZ-n;z

?Zw1_7V3k0
首先我们建立服务端,以便能够提供JSON格式的数据。在这里为了产生JSON格式的数据,我们借助于一个开源项目Json.NET。建立两个实体类型:
public classPostITPUB个人空间!@
W#_ O*q8z*o6cku
{ITPUB个人空间|8FC.\!W
public intId {get;set; }ITPUB个人空间)L
G,v1b j#Z1f
|dza-mDv0public stringTitle {get;set; }ITPUB个人空间}~"b~pEA4BX`c)q
%\.c1mO@y0public stringAuthor {get;set; }
)J5b8H$IFZ0}
public classBlogITPUB个人空间[0T*]wNwhU
{
WF8ps,D
Y.l0publicList<Post> Posts {get;set; }ITPUB个人空间 s$kLE
kg9U)dn8W
}
在Silverlight项目中我们也会使用到这两个实体类,新建一个HttpHandler,产生JSON格式数据,我们使用Json.NET中的JavaScriptConvert.SerializeObject方法即可序列化一个对象为JSON格式:
public classBlogHandler:IHttpHandler
7E N?D R/R~%{R0{ITPUB个人空间4p+?:j.o;]l d3y
ITPUB个人空间D"F1_OZm"[6f
public voidProcessRequest(HttpContextcontext)ITPUB个人空间!zU4Xa WK
{
WaYOx@)Hz7L s9^ R0context.Response.ContentType ="text/plain";
l-Y
h]'z7x0ITPUB个人空间FZ[2O$h2w%s5^
List<Post> posts =newList<Post>()
0zGk2@/F
w6l[0{ITPUB个人空间*@:[&Vx([|-g.x8F
newPost{ Id=1, Title="一步一步学Silverlight 2系列(13):数据与通信之WebRequest", Author="TerryLee"},
\!l7JL&M0newPost{ Id=2, Title="一步一步学Silverlight 2系列(12):数据与通信之WebClient", Author="TerryLee"},ITPUB个人空间"JJd5}F
newPost{ Id=3, Title="一步一步学Silverlight 2系列(11):数据绑定", Author="TerryLee"},ITPUB个人空间)JQ8u%xF5y
newPost{ Id=4, Title="一步一步学Silverlight 2系列(10):使用用户控件", Author="TerryLee"},
8mM/W$x I7aAZ\0newPost{ Id=5, Title="一步一步学Silverlight 2系列(9):使用控件模板", Author="TerryLee"},
J*v?KS2K5AWxI1hU0newPost{ Id=6, Title="一步一步学Silverlight 2系列(8):使用样式封装控件观感", Author="TerryLee"}
z0^RphI/i#q0};
(V!O9l;Wp0fHa0ITPUB个人空间.@
Y2o^_e
Blogblog =newBlog();
Myf)Eo j0blog.Posts = posts;
L+j$}0z%wJ0ITPUB个人空间Jh(RYh:u0S
context.Response.Write(JavaScriptConvert.SerializeObject(blog));
)L.^%p'bk0Ihz&y0}
C)vE#Ci}0ITPUB个人空间;E8]D)@itwk
public boolIsReusable
"Yx*\{jQX%GF9f0{
@[^-u5V4b1u&_0get
BxRQ4^GE6U hA0{ITPUB个人空间J!S B;K.j7B)i
r
return false;
KOZ M2RA,\ K/K0}ITPUB个人空间%Z:h
h2]:v
L*b*f*Wp
}
W_x(H$@^T4Q T0}
现在测试一下HttpHandler,查看一下生成的数据格式:
ITPUB个人空间+w0\t5c)Otdbs对这些数据格式化一下,看起来更明显,这里推荐一个在线JSON数据格式化工具
http://www.curiousconcept.com/jsonformatter/:
@.?!x%Tg"I%P;}0
\awI&w
v A?i
y0格式化后的数据如下:
ITPUB个人空间7@`(Kt4ns(o
ITPUB个人空间G)AR:y.~9O,h7p现在实现在Silverlight中获取JSON数据,并进行反序列化,界面布局XAML就不再贴出来了,跟前面两篇的示例一样。在
Silverlight
2中,内置了对于JSON的支持,通过命名空间System.Runtime.Serialization.Json提供,位于
System.ServiceModel.Web.dll中。
我们使用WebRequest获取数据:
private voidUserControl_Loaded(objectsender,RoutedEventArgse)
3V.kr)yigA \,[0{
~@:}J.bTj0Uriendpoint =newUri("http://localhost:8081/BlogHandler.ashx");ITPUB个人空间2}$g!K9j2p?x Fx
3d;H:{#E(e5h+M0WebRequestrequest =WebRequest.Create(endpoint);ITPUB个人空间R+@7`k,p2I K
request.Method ="POST";ITPUB个人空间6Bcr2V!KiL
request.ContentType ="application/x-www-form-urlencoded";ITPUB个人空间S V,NL
Zj
request.BeginGetResponse(newAsyncCallback(ResponseReady), request);
y*x:V.Gw0}ITPUB个人空间+?Sb.?P eb!G
ITPUB个人空间vLHl9?`.TK
voidResponseReady(IAsyncResultasyncResult)ITPUB个人空间:s-vk _x.tX+Vt7S:P/FU
{
J2_'T}^
TH0p[}0WebRequestrequest = asyncResult.AsyncStateasWebRequest;ITPUB个人空间1^8edz Oc"i_Q4E
WebResponseresponse = request.EndGetResponse(asyncResult);ITPUB个人空间!h,P
cj-WtL
ITPUB个人空间e`\U$`5E3i
using(StreamresponseStream = response.GetResponseStream())ITPUB个人空间*`'Vj
`
p;l/Mb&j
{
6\xA$_N0DataContractJsonSerializerjsonSerializer =newDataContractJsonSerializer(typeof(Blog));
G6~(A/b o0
i!K-R,Bs*D0Blogblog = jsonSerializer.ReadObject(responseStream)asBlog;ITPUB个人空间n8U]V9Sr!yZ'n?
ITPUB个人空间6rW E8]F8E{
Posts.ItemsSource = blog.Posts;
x+K#v+^
S.`^0}
+|!D L9k"u'GMY9q m_0}
DataContractJsonSerializer用于将对象序列化为JSON或者反序列化为对象实例,分别使用方法WriteObject和ReadObject。
(n$iX:c@
Bc9i0至此一个完整的在Silverlight 2对于JSON的支持示例就完成了。运行后的效果与前面的示例一样:
ITPUB个人空间
Z'Zhl Z;o o
4RY0l
en2Sf0结束语
本文简单介绍了在Silverlight 2中对于JSON的支持,DataContractJsonSerializer用于将对象序列化为JSON或者反序列化为对象实例,你可以从这里下载本文示例代码。
R'}d$o!N(P0