Silverlight实用窍门系列:38.Silverlight读取服务器端格式化的Json数据【附带实例源码】

Json数据是一种轻量级的数据交换格式,它的传输效率比XML更高,在Silverlight的应用起来可以让Silverlight获取数据速度增快,减少传输的字符数量。在本节将用一个实例来讲解如何将一个类序列化为Json数据并且传输到Silverlight端。

实现原理:在服务器端新建一个一般处理程序页面“GetJson.ashx”,使用DataContractJsonSerializer类的WriteObject()函数来将类序列化为Json数据集合,然后再Silverlight端通过DataContractJsonSerializer类的ReadObject()函数来将Json数据还原为类。当然在Silverlight端我们使用WebRequest来下载数据。

首先我们新建一个新的Silverlight应用程序,然后再服务器端和Silverlight端同时添加两个类City.cs(有数个属性)和Citys.cs(有一个属性为City类的List集合)。

public class City
 {
 private string _CityName;
 private string _CityNum;
 private string _Provence;

 public string Provence
 {
 get { return _Provence; }
 set { _Provence = value; }
 }
 public string CityNum
 {
 get { return _CityNum; }
 set { _CityNum = value; }
 }
 public string CityName
 {
 get { return _CityName; }
 set { _CityName = value; }
 }
 }
 public class Citys
 {
 private List<City> _CityList;

 public List<City> CityList
 {
 get { return _CityList; }
 set { _CityList = value; }
 }
 }

然后我们在服务器端新建一个一般处理程序页面“GetJson.ashx”,然后添加以下代码以实例化多个城市对象,然后转回为Json数据。注意在这里我们需要单独引入System.Runtime.Serialization.dll;

/// <summary>
 /// GetJson 的摘要说明
 /// </summary>
 public class GetJson : IHttpHandler
 {

 public void ProcessRequest(HttpContext context)
 {
 //步骤一
 //将类Citys格式化为Json字符串
 string JsonString = ToJsonString(GetCitys());
 context.Response.ContentType = "text/plain";
 context.Response.Write(JsonString);
 }

 private Citys GetCitys()
 {
 //实例化字符数据组
 Citys citys = new Citys();
 citys.CityList = new List<City>() {
 new City(){ CityName="成都", CityNum="028", Provence="四川"},
 new City(){ CityName="昆明", CityNum="028", Provence="云南"},
 new City(){ CityName="广州", CityNum="028", Provence="广东"},
 new City(){ CityName="上海", CityNum="028", Provence="上海"},
 new City(){ CityName="重庆", CityNum="028", Provence="重庆"}
 };
 return citys;
 }
 // 将一个Object类序列化为Json字符串
 public string ToJsonString(object ToJsonObject)
 {
 using (MemoryStream ms = new MemoryStream())
 {
 DataContractJsonSerializer serializer =
 new DataContractJsonSerializer(ToJsonObject.GetType());
 serializer.WriteObject(ms, ToJsonObject);
 StringBuilder sb = new StringBuilder();
 sb.Append(Encoding.UTF8.GetString(ms.ToArray()));
 return sb.ToString();
 }
 }
 public bool IsReusable
 {
 get
 {
 return false;
 }
 }
 }

运行GetJson.ashx页面我们可以得到类格式化为Json之后的字符如下:

{"CityList":[{"CityName":"成都","CityNum":"028","Provence":"四川"},
{"CityName":"昆明","CityNum":"028","Provence":"云南"},
{"CityName":"广州","CityNum":"028","Provence":"广东"},
{"CityName":"上海","CityNum":"028","Provence":"上海"},
{"CityName":"重庆","CityNum":"028","Provence":"重庆"}]}

在Silverlight端首先需要引入System.ServiceModel.Web.dll和System.Runtime.Serialization.dll,然后再敲入下面代码以调用一般应用程序页面得到的字符串,并且反序列化为类。

public MainPage()
{
 InitializeComponent();
 //步骤二
 //调用http://localhost:2598/GetJson.ashx获取到Json数据流
 Uri endpoint = new Uri("http://localhost:2598/GetJson.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);
 //步骤三
 //调用UI线程更新DataGrid
 this.dataGrid1.Dispatcher.BeginInvoke(()=>{
 this.dataGrid1.ItemsSource =
 (Deserialize<Citys>(response.GetResponseStream()) as Citys).CityList;
 });
}
// 将Json字符流反序列化为对象
public static T Deserialize<T>(Stream stream)
{
 DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
 return (T)serializer.ReadObject(stream);
}

本实例采用VS2010+Silverlight 4.0,如需源码请点击 SLLinkJson.rar 下载。

时间: 2024-12-28 20:11:54

Silverlight实用窍门系列:38.Silverlight读取服务器端格式化的Json数据【附带实例源码】的相关文章

Silverlight实用窍门系列:42.读取拖动到控件上的外部txt和jpg文件,多外部文件的拖动【附带实例源码】

本实例将读取拖动到Silverlight的ListBox控件中的txt文件或者Jpg文件.在本实例中将讲如果通过UIelementA.Drop事件获取到拖动到UIelementA上的文件的相关名称以及路径等信息,以处理多个外部文件拖动到Silverlight中的相关一些小技巧的应用和操作. 在本例中我们设置外部文件拖动到ListBox中去,首先我们要设置ListBox的AllowDrop="True",再添加一个Drop事件Drop="listBox1_Drop",

Silverlight 5 beta新特性探索系列:3.Silverlight5中的文字增进控制【附带实例源码】

在Silverlight 5中新增了CharacterSpacing属性对文字间距进行控制,增加了RichTextBoxOverflow控件以灵活的对大量文字进行合理的排版显示. 一.CharacterSpacing属性 在Silverlight原来的版本中文字和文字之间并没有一个间距控制属性,这让某一些特殊的文字显示场合排版不易(比如杂志,电子报),在Silverlight 5中引入的CharacterSpacing属性就可以很好处理文字间距,它可用做TextBlock,RichTextBox

Silverlight实用窍门系列:37.Silverlight和ASP.NET相互传参的两种常用方式(QueryString,Cookie)【附带实例源码】

在本节中将讲述Silverlight和ASP.NET页面的相互传参的两种常用方式:Cookie和QueryString.首先我们新建一个名为SLConnectASP.NET的Silverlight应用程序,然后在SLConnectASP.NET.web项目中添加一个Index.aspx的页面. 一.Silverlight和ASPX页面的QueryString传参 实现思路:在Silverlight端跳转到页面到Index.aspx并且传递一个QueryString参数ID,在该Index.asp

Silverlight实用窍门系列:40.Silverlight中捕捉视频,截图保存到本地【附带实例源码】

在Silverlight中我们可以捕捉视频设备以制作视频会议系统,或者通过视频设备截图功能上传头像等功能. 下面我们通过一个简单的实例来访问视频设备,并且截取图像下载该截图文件至本地. 一.在Silverlight运行界面中我们检查系统默认摄像头和麦克风是否可用如下图: 二.我们看Xaml代码如下所示: <Grid x:Name="LayoutRoot" Background="White"> <Border BorderBrush="S

Silverlight实用窍门系列:49.Silverlight中管理独立存储--Isolated Storage【附带实例源码】

Silverlight中的独立存储是其内部的可信任的可访问文件空间,在这里你可以使用Silverlight随意的创建.读取.写入.删除目录和文件,它有一些类似于Cookie,但是它可以在客户端保存大量的数据.这个空间默认是1M,如果不够的时候可以申请扩大容量. 网站+用户+应用程序定位一个独立存储,也就是说必须得相同网站,相同用户,相同应用程序才能够访问这个独立的存储空间.独立存储是IsolatedStorageFile密封类来进行设置的,这个类分布在命名空间System.IO.Isolated

Silverlight实用窍门系列:41.Silverlight中调用麦克风模拟录音机设备,存储为WAV音频【附带实例源码】

   在Silverlight 4中支持了麦克风设置的调用,在本节中我们将调用麦克风设备,然后进行录音,并且将录制的声音存取为Wav音频文件.         第一步.首先我们从AudioSink类派生一个音频接收器类:WavAudioSink.其代码如下所示: public class WavAudioSink:AudioSink { // 设置需要记录的内存流 private MemoryStream _stream; // 设置当前的音频格式 private AudioFormat _fo

Silverlight实用窍门系列:51.Silverlight页面控件的放大缩小、Silverlight和Html控件的互相操作【附带源码实例】

    本节将讲述三个Silverlight中应用的小技巧:Silverlight页面的放大缩小.Silverlight操作Html.Html操作Silverlight控件. 一.Silverlight页面的放大缩小         首先对于Silverlight页面的放大缩小我们可以使用ScaleTransform对Canvas控件进行设置.这样所有在该Canvas控件内的所有子控件都被放大缩小.         下面我们看Xaml源码如下: <Canvas MouseWheel="La

Silverlight实用窍门系列:48.DataGrid行详细信息的绑定--DataGrid.RowDetailsTemplate【附带实例源码】

在Silverlight中的DataGrid控件使用中我们想点击其中一行并且看这一行的详细信息应该如何做呢?而且这个详细信息是多行的数据,而非简单的几个属性. 在这里我们使用DataGrid.RowDetailsTemplate来设置或者获取行详细信息.首先我们准备一个DataGrid命名为A,设置其RowDetailsVisibilityMode="VisibleWhenSelected" (行详细信息模板的显示模式是当这行被选中的时候展开这行的详细信息.)然后再为A设置DataGr

Silverlight实用窍门系列:47.Silverlight中元素到元素的绑定,以及ObservableCollection和List的使用区别

 问题一:在某一些情况下,我们使用MVVM模式的时候,对于某一个字段(AgeField)需要在前台的很多个控件(A.B.C.D.E)进行绑定,但是如何能够让我们后台字段名改变的时候能够非常方便的改变所有使用了这个字段的控件呢?         回答:使用Element to Element Binding,将AgeFiled绑定到A控件,然后再让B.C.D.E控件绑定A控件的使用AgeField字段的属性.         例如:字段(AgeField)的数据是年龄大小,A.B.C.D.E控件分