Silverlight访问ashx JSON响应

时间:2009-08-14 22:26:03

标签: c# asp.net silverlight json ashx

我有一个Silverlight应用程序正在调用与Silverlight控件在同一应用程序中托管的ashx。

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。

2 个答案:

答案 0 :(得分:1)

使用System.Json将字符串加载到JsonArray中。 JsonValue.Load()接受一个响应流并可以填充JsonArray - 从那里,您可以迭代或使用LINQ来查询值。

链接:

答案 1 :(得分:0)

感谢Jon的回复。你的链接帮助我搞清楚了,我认为我应该将我在这个问题中使用的代码包含在将来遇到这个问题的其他人中。

两种处理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)
{
}

处理属于Silverlight框架的Json数据的第一种方法是添加对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));

这两种方法最终都会给我一个我的对象列表,然后我可以根据需要使用它。

感谢Jon的帮助!