使用JSON.net反序列化JSON流

时间:2011-09-12 20:21:13

标签: c# json windows-phone-7 json.net

我最近从使用SOAP切换到JSON。我现在遇到了性能问题,因为在我的WP7设备上反序列化JSON流大约需要26秒。

因此我考虑过使用Json.net而不是DataContractJsonSerializer。

但是,我无法找到关于此的更多信息。

我使用webclient然后使用OpenReadAsync,所以我有一个Stream作为e.Result。

如何使用Json.net将该流转换为对象?

我应该使用DownloadStringAsync吗?

这是目前正常运作的守则:

//string URL = ""; //Actual URL to JSON is here

WebClient client = new WebClient();
client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);
client.OpenReadAsync(new Uri(URL, UriKind.Absolute));

事件处理程序:

void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
     DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(JSONObject), null);
     JSONObject data = serializer.ReadObject(e.Result) as JSONObject;
}

JSONObject是服务的SOAP端点的响应对象,但两个端点都返回相同的数据。

这很好用,我可以像解析SOAP响应那样继续解析数据,但我希望它能更快地反序列化。

1 个答案:

答案 0 :(得分:3)

为了反序列化,你需要整个JSON。使用DownloadStringAsync可能更好,一旦收到整个JSON字符串,就可以反序列化它。

然后在您的DownloadStringCompleted中,您可以传入要将其反序列化的课程。例如,如果您收到的JSON如下:

{ name: "smoak", title: "super awesome" }

然后你需要创建一个包含这些属性的类:

class SomeClassName 
{
    publc string name { get;set;}
    public string title { get;set; }
}

并将其传递给JsonConvert:

var deserializedObj = JsonConvert.DeserializeObject<SomeClassName>(e.Result);
Console.WriteLine(deserializedObj.name);