.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个人空间 Gf)~D#H8s-n ~Om a

(V-`;z/Xxi0

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

public classPostITPUB个人空间/I:t6{Lv4X&?
^
{
?.h)N8xUO.\+S&^0public intId {get;set; }ITPUB个人空间9RBH `G {

$pj*m;p"|m0public stringTitle {get;set; }ITPUB个人空间KS"u-i9E*A
ITPUB个人空间l2]0Bv tj\d6`#G^?
public stringAuthor {get;set; }ITPUB个人空间!a*oe0k,h3E"[$W%P
}
public classBlog
t R:]T0l#_0
{ITPUB个人空间)q1ac;ip2S*Gl@O.w
publicList<Post> Posts {get;set; }
"@9gE0HD0}

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

public classBlogHandler:IHttpHandler
,|WP3v2\ Jj8?V V0
{
.zU kbVM3V,LH0
6h7v6i?*E P!qc0public voidProcessRequest(HttpContextcontext)
?U B~}!Xm0{
\3kVC%t.A,ik0context.Response.ContentType ="text/plain";
/K3rL2O9W%wz0
fyL8{ f| l"X0List<Post> posts =newList<Post>()ITPUB个人空间+Ukt l@j;hS*@{ {){
{ITPUB个人空间~N W.bCl%s$[4cl
newPost{ Id=1, Title="一步一步学Silverlight 2系列(13):数据与通信之WebRequest", Author="TerryLee"},ITPUB个人空间"I h~jJ
newPost{ Id=2, Title="一步一步学Silverlight 2系列(12):数据与通信之WebClient", Author="TerryLee"},
ikau9Cas}&HF/D0newPost{ Id=3, Title="一步一步学Silverlight 2系列(11):数据绑定", Author="TerryLee"},
wQS4F0Tm6f0newPost{ Id=4, Title="一步一步学Silverlight 2系列(10):使用用户控件", Author="TerryLee"},ITPUB个人空间n"[1V@6N9G q
newPost{ Id=5, Title="一步一步学Silverlight 2系列(9):使用控件模板", Author="TerryLee"},ITPUB个人空间 P r2Z-L2[Q+i
newPost{ Id=6, Title="一步一步学Silverlight 2系列(8):使用样式封装控件观感", Author="TerryLee"}
[ w:KCc,D1H0};ITPUB个人空间 ixzJ+ETsb;@

E H@wm'{j| \i%l0Blogblog =newBlog();
q.M!M i%C0B)P7mCg0blog.Posts = posts;ITPUB个人空间it e"`o9x,h+b3c
ITPUB个人空间3WM*u^mg!O s
context.Response.Write(JavaScriptConvert.SerializeObject(blog));ITPUB个人空间?'G:~S$oZU:s
}ITPUB个人空间o{Ok1}$~_ jN

}Sd P3R3Dl!X0public boolIsReusable
;_ |#v @.u}9T0{
W @.vyB0SY0getITPUB个人空间1wZ?Q5o'g ]6\)?
{ITPUB个人空间 y Z"S!A:kf
return false;ITPUB个人空间 x8[YxT%qt _
}ITPUB个人空间(d X8Gv4f!FCA
}ITPUB个人空间,E+fwP/z~+k p
}

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


.G"o4DHRK"p;N%Hg0对这些数据格式化一下,看起来更明显,这里推荐一个在线JSON数据格式化工具http://www.curiousconcept.com/jsonformatter/
GM|0L6J}B;d0
#E%C\$Y$z M0格式化后的数据如下:ITPUB个人空间~Q*C!J)so:h*d8mU
ITPUB个人空间 J"C|Ip8W%W6G A7H

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

我们使用WebRequest获取数据:

private voidUserControl_Loaded(objectsender,RoutedEventArgse)
Q/L5LGg+[[nA/^0{ITPUB个人空间,w#^4U7bw4wvB)Z
Uriendpoint =newUri("http://localhost:8081/BlogHandler.ashx");ITPUB个人空间R*K Yx(DQITm

D E? P/tX v0WebRequestrequest =WebRequest.Create(endpoint);
8e6bt6@3w)t,^V#t0request.Method ="POST";
;Y|q.zdI#w ?r0request.ContentType ="application/x-www-form-urlencoded";
Rf(|}6` rp$a!?0request.BeginGetResponse(newAsyncCallback(ResponseReady), request);
9]4t"w tio-o0}ITPUB个人空间P9Vr%B;H8HAA
ITPUB个人空间Gk"w1zy Y.TP3}#aw
voidResponseReady(IAsyncResultasyncResult)
w+_p7@!i0{
uf!} |}tt B[Q6@W0WebRequestrequest = asyncResult.AsyncStateasWebRequest;
r!J$mloP0WebResponseresponse = request.EndGetResponse(asyncResult);ITPUB个人空间jg9SD+K8FR2e,Q

}Njx~_9oC&vg.e0using(StreamresponseStream = response.GetResponseStream())
'o&wI%hy'Pk FM Dx0{ITPUB个人空间&l,k)sM8f7Uu!{%K
DataContractJsonSerializerjsonSerializer =newDataContractJsonSerializer(typeof(Blog));
0ApC'R*k4N0
/o @C }'w:W0Blogblog = jsonSerializer.ReadObject(responseStream)asBlog;
/WO:P'K,Hj|sLE0
$[ bg_eo LJ0Posts.ItemsSource = blog.Posts;ITPUB个人空间|9_"HD o MFZ
}
%qm8u%~*AUpg0}

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

ITPUB个人空间Bmx o\_;HY
至此一个完整的在Silverlight 2对于JSON的支持示例就完成了。运行后的效果与前面的示例一样:
'K\o8D&D*dTN6?0ITPUB个人空间8k?^J Ln

结束语

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

作者:TerryLeeITPUB个人空间5p Ls |6UA:x,a
出处:http://terrylee.cnblogs.com
ITPUB个人空间YQ ]QP,zx0a

TAG:

 

评分:0

我来说两句

显示全部

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

日历

« 2008-07-24  
  12345
6789101112
13141516171819
20212223242526
2728293031  

数据统计

  • 访问量: 25805
  • 日志数: 762
  • 影音数: 7
  • 文件数: 1
  • 建立时间: 2008-01-04
  • 更新时间: 2008-07-24

RSS订阅

Open Toolbar