一步一步学Silverlight 2系列(16):数据与通信之JSON

概述

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

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

简单示例

在本文中我们仍然采用前面两篇文章中用过的显示最新随笔这样一个示例(举一反三嘛:)),最终完成的效果如下图所示:

TerryLee_Silverlight2_0065

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

public class Post
{
    public int Id { get; set; }

    public string Title { get; set; }

    public string Author { get; set; }
}
public class Blog
{
    public List<Post> Posts { get; set; }
}

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

public class BlogHandler : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain";

        List<Post> posts = new List<Post>()
        {
            new Post{ Id=1, Title="一步一步学Silverlight 2系列(13):数据与通信之WebRequest", Author="TerryLee" },
            new Post{ Id=2, Title="一步一步学Silverlight 2系列(12):数据与通信之WebClient", Author="TerryLee" },
            new Post{ Id=3, Title="一步一步学Silverlight 2系列(11):数据绑定", Author="TerryLee" },
            new Post{ Id=4, Title="一步一步学Silverlight 2系列(10):使用用户控件", Author="TerryLee" },
            new Post{ Id=5, Title="一步一步学Silverlight 2系列(9):使用控件模板", Author="TerryLee" },
            new Post{ Id=6, Title="一步一步学Silverlight 2系列(8):使用样式封装控件观感", Author="TerryLee" }
        };

        Blog blog = new Blog();
        blog.Posts = posts;

        context.Response.Write(JavaScriptConvert.SerializeObject(blog));
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

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

TerryLee_Silverlight2_0073

对这些数据格式化一下,看起来更明显,这里推荐一个在线JSON数据格式化工具http://www.curiousconcept.com/jsonformatter/

TerryLee_Silverlight2_0075

格式化后的数据如下:

TerryLee_Silverlight2_0076

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

我们使用WebRequest获取数据:

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
    Uri endpoint = new Uri("http://localhost:8081/BlogHandler.ashx");

    WebRequest request = WebRequest.Create(endpoint);
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    request.BeginGetResponse(new AsyncCallback(ResponseReady), request);
}

void ResponseReady(IAsyncResult asyncResult)
{
    WebRequest request = asyncResult.AsyncState as WebRequest;
    WebResponse response = request.EndGetResponse(asyncResult);

    using (Stream responseStream = response.GetResponseStream())
    {
        DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Blog));

        Blog blog = jsonSerializer.ReadObject(responseStream) as Blog;

        Posts.ItemsSource = blog.Posts;
    }
}

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

TerryLee_Silverlight2_0074

至此一个完整的在Silverlight 2对于JSON的支持示例就完成了。运行后的效果与前面的示例一样:

TerryLee_Silverlight2_0065

结束语

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

下一篇:一步一步学Silverlight 2系列(17):数据与通信之ADO.NET Data Services

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
Tag标签: Silverlight

posted on 2008-03-10 18:28 TerryLee 阅读(4591) 评论(25)  编辑 收藏 所属分类: Silverlight

评论

#1楼  2008-03-11 12:53 redmoon      

为什么最初没有用DataContractJsonSerializer来序列化,而用JavaScriptConvert?   回复  引用  查看    

#2楼 [楼主] 2008-03-11 13:26 TerryLee      

@redmoon
是这样的,Silverlight作为一种客户端技术,它接收的JSON数据不一定都是用DataContractJsonSerializer来序列化的,可能有用各种方法序列化的:)

另一方面,DataContractJsonSerializer在Web项目中好像无法使用。。。   回复  引用  查看    

#3楼  2008-03-14 23:14 o0myself0o [未注册用户]

李老师:
为什么我用了using System.Net;之后能点出WebClient,却点不出WebRequest和WebResponse啊?   回复  引用    

#4楼 [楼主] 2008-03-14 23:28 TerryLee      

@o0myself0o
添加一下对System.Net.dll的引用   回复  引用  查看    

#5楼  2008-03-16 02:15 o0myself0o [未注册用户]

@TerryLee
我添加了这个引用啊,WebClient都能点得出来,但是WebRequest和WebResponse却不能,不知道是什么情况!   回复  引用    

#6楼  2008-03-16 11:04 zhuibobo      

博主真是太强了...2.0才出了没多久就写了怎么多....
请问在silverlinght中当出现滚动条的时候有办法使用鼠标中键滚动吗?   回复  引用  查看    

#7楼 [楼主] 2008-03-16 16:14 TerryLee      

@o0myself0o
这个问题应该不会出现。
1.在Silverlight项目上点击右键,选择Add Reference,弹出的对话框中选择System.Net。

2.在.xaml.cs文件中引入System.Net命名空间,就可以了。。。   回复  引用  查看    

#8楼 [楼主] 2008-03-16 16:15 TerryLee      

@zhuibobo
呵呵,谢谢

鼠标中键没有测试过   回复  引用  查看    

#9楼  2008-03-21 20:03 Cat Chen      

其实ASMX和WCF的Web Service都能输出为JSON啊。   回复  引用  查看    

#10楼 [楼主] 2008-03-21 22:15 TerryLee      

@Cat Chen
是的,的确都可以输出:)   回复  引用  查看    

#11楼  2008-03-27 22:05 DRIVER.PRO      

如果我需要传参数获取值呢?   回复  引用  查看    

#12楼  2008-03-30 23:43 driverpro [未注册用户]

为何我在调试的时候使用IIS调试,并且将测试地址改为:
Uri endpoint = new Uri(http://192.168.0.1/BlogHandler.ashx);
那么 response.GetResponseStream() 得到的 responseStream 就为 null 呢?   回复  引用    

#13楼  2008-04-08 13:56 欧总 [未注册用户]

--引用--------------------------------------------------
o0myself0o: @TerryLee
我添加了这个引用啊,WebClient都能点得出来,但是WebRequest和WebResponse却不能,不知道是什么情况!
--------------------------------------------------------
查看了 SilverLight里的System.Net.WebCilent的结构后发现 跟Web项目里的结构是不一样的 添加引用也是不支持的 只有一个解释 就是SilverLight并不是所有引用都可以添加的   回复  引用    

#14楼  2008-04-08 14:21 欧总 [未注册用户]

哈哈 原来 WebRequest 不在 webclient下 是在 System.Net下 引用后就有了 谢谢老师   回复  引用    

#15楼  2008-05-22 16:19 星际      

挺不错的,引用下   回复  引用  查看    

#16楼  2008-07-24 16:58 aaaa [未注册用户]

dg.ItemsSource = blog.Posts; 怎么不显示数据,我用的是beat 2,跟踪blog.Posts列表中的数据正常,帮帮忙   回复  引用    

#17楼 [楼主] 2008-07-25 09:51 TerryLee      

@aaaa
看看你在Xaml中有没有设置显示成员的绑定?   回复  引用  查看    

#18楼  2008-07-25 15:29 aaaa [未注册用户]

有啊,<ListBox x:Name="Posts" Grid.Row="1" Margin="40 10 10 10">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Id}" Height="40" Foreground="Red"></TextBlock>
<TextBlock Text="{Binding Title}" Height="40"></TextBlock>
<TextBlock Text="{Binding Author}" Height="40" Foreground="Orange"></TextBlock>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
应该没问题吧,   回复  引用    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-03-10 23:07 编辑过
 
历史上的今天:

另存  打印
 


导航

公告

  • 网名:TerryLee
  • 本名:李会军
  • 位置:中国北京 Ethos
  • 联系方式:
  • 访问我的个人主页

 MVP配置

 个人主页

 版权声明

  • 本站采用创作共用许可 署名,非商业

绿色通道

IT新闻

统计

与我联系

留言簿(323)

我的标签

随笔分类

随笔档案

个人站点

关注项目

好的网站

我的好友

搜索

积分与排名

阅读排行榜

评论排行榜