Приложение Windows Phone 7 закрывается при попытке десериализации JSON - PullRequest
0 голосов
/ 05 августа 2010

Я занимаюсь разработкой своего первого приложения для Windows Phone 7 и столкнулся с проблемой. в основном это просто чтение строки событий json и привязка ее к списку (используя начальную точку приложения списка)

public void Load()
{
    // form the URI
    UriBuilder uri = new UriBuilder("http://mysite.com/events.json");

        WebClient proxy = new WebClient();  
    proxy.OpenReadCompleted += new OpenReadCompletedEventHandler(OnReadCompleted);  
    proxy.OpenReadAsync(uri.Uri);  
}

void OnReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
    if (e.Error == null)
    {
        var serializer = new DataContractJsonSerializer(typeof(EventList));
        var events = (EventList)serializer.ReadObject(e.Result);
        foreach (var ev in events)
        {
            Items.Add(ev);
        }
    }
}

public ObservableCollection<EventDetails> Items { get; private set; }

EventDetails - это мой класс, который переносит строку json. этот класс должен быть правильным, потому что это точная копия класса, используемого внутренним сайтом, из которого генерируется json ...

Я правильно получаю строку json из вызова webclient (я прочитал поток памяти, и json действительно есть), но как только я пытаюсь десериализовать строку, приложение завершается, и отладчик останавливается.

Я не получаю сообщения об ошибке или каких-либо признаков того, что что-то происходит, оно просто останавливается. Это происходит, если я ввожу метод десериализации в окно просмотра ...

Я уже пытался использовать JSON.net, на самом деле я подумал, что это может быть проблема с JSON.net, поэтому я преобразовал его для использования собственного десериализатора в .net framework, но ошибка в любом случае одинакова.

почему приложение просто закрывается? разве это не должно давать мне НЕКОТОРЫЕ сообщения об ошибках?

что я могу делать не так?

большое спасибо!

Ответы [ 3 ]

1 голос
/ 11 февраля 2011

Приложение закрывается, потому что происходит необработанное исключение. Если проверить файл App.xaml.cs, вы найдете код, который закрывает ваше приложение. Что вам нужно сделать, это попытаться поймать процесс десериализации и обработать его локально. Поэтому, скорее всего, у вас есть какой-то JSON, который DataContractJsonSerializer не нравится. У меня были проблемы с десериализацией WCF JSON и мне пришлось идти другими путями.

Возможно, вы захотите убедиться, что ваш JSON действителен, просто потому, что вашему веб-сайту это нравится, это не значит, что он действительно действителен, код на вашем сайте может помочь исправить проблему. Перетащите копию вашего JSON-объекта (строки) в http://jsonlint.com/, чтобы увидеть, является ли он действительным или нет. Крокфорд (парень, который создал JSON) написал этот сайт для проверки JSON, поэтому я бы положился на него больше, чем на ваш сайт;) Этот небольшой сайт действительно помог мне решить некоторые проблемы за последний год.

1 голос
/ 05 августа 2010

Во-первых, тот факт, что у вас есть какая-то строка, похожая на JSON, не означает, что у вас есть действительный JSON.Попробуйте преобразовать простую.

Если ваш JSON действителен, возможно, ваша реализация JSON не знает, как преобразовать список в EventList.Попробуйте вместо этого ArrayList и дайте мне знать.

0 голосов
/ 24 октября 2010

Я столкнулся с такой же проблемой, когда пытался перенести существующий код WM для работы на WP7.Я считаю, что приложение WP7 аварийно завершает работу всякий раз, когда оно загружает сборку (или класс?), Которая ссылается на то, чего нет в WP7.В моем случае я думаю, что это был Assembly.Load или что-то в пространстве имен System.IO, связанное с доступом к файлам по путям.

Хотя в вашем случае может быть что-то совершенно другое, симптомы были точно такими же.1003 *

Единственное, что я могу порекомендовать, это просмотреть библиотеку JSON и посмотреть, ссылаются ли на нее базовые классы, которые не разрешены в WP7.Обратите внимание, что ему даже не нужно попадать в строку кода, которая вызывает проблему, - он рухнет, как только попытается попасть в класс, содержащий неверную ссылку.

Если вы можете войти вВ библиотеке JSON вы можете лучше понять, какой класс вызывает проблему, потому что, как только код ссылается на него, происходит сбой всего приложения и отладчик.

...