Десериализация потока JSON с помощью JSON.net - PullRequest
2 голосов
/ 13 сентября 2011

Я недавно переключился с использования SOAP на JSON. Теперь у меня проблема с производительностью, потому что для десериализации потока JSON на моем устройстве WP7 требуется около 26 секунд.

Поэтому я подумал об использовании Json.net вместо DataContractJsonSerializer.

Однако я не смог найти много информации об этом.

Я использую веб-клиент, а затем OpenReadAsync, поэтому у меня есть поток как 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 Ответ

3 голосов
/ 13 сентября 2011

Для десериализации вам понадобится весь 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...