本文将介绍38.Silverlight读取服务器端格式化的Json数据的详细情况,。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于Silverlig1.Sil
本文将介绍38.Silverlight读取服务器端格式化的Json数据的详细情况,。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于Silverlig1.Silverlight读取外部XML加载配置-(使用WebClient读取XAP包同目录下的XML文件)、Silverlight 2学习教程(六): Silverlight托管代码调用Javascript中的JSON对象、Silverlight 5 beta新特性探索系列:1.安装Silverlight 5 beta环境以及OOB模式下Silverlight 5 多窗口支持、Silverlight 5 beta新特性系列:6.Silverlight 5新增低延迟声音效果类SoundEffect.支持wav音乐格式的知识。
本文目录一览:- 38.Silverlight读取服务器端格式化的Json数据
- Silverlig1.Silverlight读取外部XML加载配置-(使用WebClient读取XAP包同目录下的XML文件)
- Silverlight 2学习教程(六): Silverlight托管代码调用Javascript中的JSON对象
- Silverlight 5 beta新特性探索系列:1.安装Silverlight 5 beta环境以及OOB模式下Silverlight 5 多窗口支持
- Silverlight 5 beta新特性系列:6.Silverlight 5新增低延迟声音效果类SoundEffect.支持wav音乐格式
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="昆明", 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 下载。
Silverlig1.Silverlight读取外部XML加载配置-(使用WebClient读取XAP包同目录下的XML文件)
使用WebClient读取XAP包同目录下的XML文件
我们想要读取XAP包下面的XML文件,需要将此XML文件放在加载XAP包的网页的目录中去,然后使用URI方式读取此URL方式下的XML文件。
首先使用WebClient来异步下载此URL方式的XML文件,然后使用XmlReader来读取此XML文件的数据内容。
在这里我们一共有3个知识点需要掌握:
第一:获取当前调用此Silverlight程序XAP包的网页的地址的前缀,以获取XML文件的URL地址。
public static string GetURL()
{
ScriptObject location = (HtmlPage.Window.GetProperty("location") as ScriptObject);
object r = location.GetProperty("href");
string URL = r.ToString().Substring(0,r.ToString().LastIndexOf('/')); //截取到当前SILVERLIGHT程序存放网络URL的前缀
return URL;
}
第二:使用WebClient下载XML文件
Uri uri = new Uri(GetURL() + "/Config.xml",UriKind.Absolute);
WebClient Appclient = new WebClient();//使用WebClient下载config.xml文件,进行异步读取。
Appclient.OpenReadAsync(uri);
Appclient.OpenReadCompleted += new OpenReadCompletedEventHandler(Appclient_OpenReadCompleted);
第三:使用XmlReader读取XML文件
Stream stream = e.Result;
using (XmlReader xReader = XmlReader.Create(stream))
{
xReader.ReadToFollowing("TestData");//使用XmlReader一直查找“TestData”元素读取该元素数据。
string TestData = xReader.ReadElementContentAsstring();
MessageBox.Show(TestData);
xReader.ReadToNextSibling("SecData");//使用ReadToNextSibling一直查找同级的“SecData”元素的数据,直到找到为止。
string SecData = xReader.ReadElementContentAsstring();
MessageBox.Show(SecData);
}
需要引入的域名空间如下:
using System.IO;
using System.Xml;
using System.Windows.browser;
所有的具体代码如下:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Net;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Documents;
- using System.Windows.Input;
- using System.Windows.Media;
- using System.Windows.Media.Animation;
- using System.Windows.Shapes;
- using System.IO;
- using System.Xml;
- using System.Windows.browser;
- namespace SLreadxml
- {
- public partial class MainPage : UserControl
- {
- public MainPage()
- {
- InitializeComponent();
- Uri uri = new Uri(GetURL() + "/Config.xml", UriKind.Absolute);
- WebClient Appclient = new WebClient();//使用WebClient下载config.xml文件,进行异步读取。
- Appclient.OpenReadAsync(uri);
- Appclient.OpenReadCompleted += new OpenReadCompletedEventHandler(Appclient_OpenReadCompleted);
- }
- void Appclient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
- {
- Stream stream = e.Result;
- using (XmlReader xReader = XmlReader.Create(stream))
- {
- xReader.ReadToFollowing("TestData");//使用XmlReader一直查找“TestData”元素读取该元素数据。
- string TestData = xReader.ReadElementContentAsstring();
- MessageBox.Show(TestData);
- xReader.ReadToNextSibling("SecData");//使用ReadToNextSibling一直查找同级的“SecData”元素的数据,直到找到为止。
- string SecData = xReader.ReadElementContentAsstring();
- MessageBox.Show(SecData);
- }
- }
- /// <summary>
- /// 获取当前SILVERLIGHT程序存放网络URL的前缀
- /// </summary>
- /// <returns>URL前缀</returns>
- public static string GetURL()
- {
- ScriptObject location = (HtmlPage.Window.GetProperty("location") as ScriptObject);
- object r = location.GetProperty("href");
- string URL = r.ToString().Substring(0, r.ToString().LastIndexOf('/')); //截取到当前SILVERLIGHT程序存放网络URL的前缀
- return URL;
- }
- }
- }
config.xml文件代码
- <configuration>
- <TestData>First Test Data</TestData>
- <SecData>Secend Test Data</SecData>
- </configuration>
本实例程序在Silverlight 4.0的开发环境,VS2010开发。
以下为源码:点击下载SLReadXML.rar
Silverlight 2学习教程(六): Silverlight托管代码调用Javascript中的JSON对象
xmlns
xmlns:x
Width
{
{
{
InitializeComponent();
}
{
{
UserInputContent = "Hello Silverlight World!";
}
{
UserInputContent = "你好,
}
HtmlWindow win = HtmlPage.Window;
win.Alert("Silverlight 里面弹出的对话框。
Object[] args = { "将此参数传递给
win.Invoke("getArrayTest", args);