我最近从使用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响应那样继续解析数据,但我希望它能更快地反序列化。
答案 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);