Silverlight访问ashx JSON响应
问题描述:
我有一个Silverlight应用程序调用与Silverlight控件在同一应用程序中托管的ashx。Silverlight访问ashx JSON响应
的ASHX做以下(精简):
// Basic object
class SomeObject
{
int ID { get; set; }
string Description { get; set; }
double Value { get; set; }
}
// ASHX details
DataLayer dl = GetDataLayer();
List<SomeObject> lst = dl.ListObjects();
string result = "";
if (lst != null)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
result = serializer.Serialize(lst);
}
context.Response.ContentType = "application/json";
context.Response.Write(result);
context.Response.End();
现在我有麻烦的部分是做什么用我的Silverlight控件的ASHX做。
我正在寻找调用ashx,然后将JSON结果映射到我的内部silverlight对象。看起来像一个非常简单的任务,但我不知道如何访问ashx或处理它的响应。由于Silverlight有一个精简版的.NET,所以它会抛弃我。
任何帮助/建议吗?
使用Silverlight 3,ASP.NET 3.5。
答
使用System.Json将字符串加载到JsonArray中。 JsonValue.Load()接受一个响应流并且可以填充一个JsonArray - 你可以通过迭代或者使用LINQ来查询这些值。
链接:
答
感谢您的答复乔恩。你的链接帮助我弄清楚了,我想我应该把这个问题中使用的代码包含在将来遇到这个问题的其他人的代码中。
两种处理Json的方法。对于这两种方法,您需要设置一个处理程序来获取Json数据。
// This gets the URL to call to get the Json data
Uri uri = GetSomeUrl();
WebClient downloader = new WebClient();
downloader.OpenReadCompleted += new OpenReadCompletedEventHandler(downloader_OpenReadCompleted);
downloader.OpenReadAsync(uri);
然后,您需要实现以上的代码来处理JSON指定的事件处理程序downloader_OpenReadCompleted
。在这两种情况下,下面的代码应该被包装在一个using语句:
using (System.IO.Stream strResult = e.Result)
{
}
第一种方式来处理JSON数据是Silverlight框架的一部分,是为了添加引用System.Json
。
JsonArray jsonArray = (JsonArray)JsonArray.Load(e.Result);
List<SomeObject> lst = new List<SomeObject>();
foreach (System.Json.JsonObject obj in jsonArray)
{
SomeObject obj = new SomeObject();
obj.ID = int.Parse(obj["ID"].ToString();
obj.Description = obj["Description"].ToString();
obj.Value = double.Parse(obj["Value"].ToString());
lst.Add(obj);
}
这是可能有或没有Silverlight的另一种方式是:
System.Runtime.Serialization.Json.DataContractJsonSerializer serializer =
new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(List<SomeObject>));
List<SomeObject> lst = (List<SomeObject>)(serializer.ReadObject(strResult));
这两种方法最终得到了我对象的列表,它作为我认为合适的我就可以使用。
感谢您的帮助乔恩!