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="昆明", Provence="云南"}, new City(){ Cityname="广州", Provence="广东"}, new City(){ Cityname="上海", Provence="上海"}, new City(){ Cityname="重庆", 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":"昆明","Provence":"云南"}, {"Cityname":"广州","Provence":"广东"}, {"Cityname":"上海","Provence":"上海"}, {"Cityname":"重庆","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 下载。
总结以上是内存溢出为你收集整理的38.Silverlight读取服务器端格式化的Json数据全部内容,希望文章能够帮你解决38.Silverlight读取服务器端格式化的Json数据所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)