Invalid Cast Exception, JSON, Windows Phone - PullRequest
0 голосов
/ 02 апреля 2012

Привет. Почему я получаю исключение при касте?

    public class RootContainer2
    {
            [DataMember]
            public string StopName { get; set; }

            [DataMember]
            public string StopId { get; set; }

            [DataMember]
            public string Stop { get; set; }

            [DataMember]
            public ObservableCollection<Stops> Stops { get; set; }
    }

        private void ContentPanel_Loaded(object sender, RoutedEventArgs e)
        {
            textRouteId.Text = this.NavigationContext.QueryString["name"];

            string myvar = textRouteId.Text;

            try
            {
                WebClient webClient = new WebClient();
                Uri uri = new Uri("websiteurl");
                webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(webClient_OpenReadCompleted);
                webClient.OpenReadAsync(uri);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {
            DataContractJsonSerializer ser = null;

            try
            {
                ser = new DataContractJsonSerializer(typeof(RootContainer2));
                RootContainer2 rootContainer = ser.ReadObject(e.Result) as RootContainer2;
                foreach (Stops em in rootContainer.Stops)
                {

                    string df = em.StopName;
                    string dt = em.StopId;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

Вот вывод json, который я пытаюсь прочитать, но получаю недопустимое исключение приведения.

{"RouteId": "1231", "RouteName":"1 Whitehawk - Mile Oak", "Stops": [ { "StopId":"6882", "StopName":"Swanborough Drive", "OperatorsCode4":"bridmpj", "Lat":"50.8326729229821", "Lng":"-0.103217996656901" } , { "StopId":"6883", "StopName":"Haybourne Road", "OperatorsCode4":"brimapm", "Lat":"50.8317788816436", "Lng":"-0.10486427645364671" } , { "StopId":"6884", "StopName":"Coolham Drive", "OperatorsCode4":"brijtwm", "Lat":"50.829695439856089", "Lng":"-0.10512229365031489" } , { "StopId":"6885", "StopName":"St Cuthmans Church", "OperatorsCode4":"briapdg", "Lat":"50.8283233642578", "Lng":"-0.104808002710342" } , 

Плюс класс в stop.cs:

public class Stops
{
    public string StopId { get; set; }
    public string StopName { get; set; }
}

EDIT:

Итак, после создания собственного URL-адреса и проверки данных, это как-то связано с URL-адресом, который мне дали. Просто делаю дальнейшее тестирование.

Редактировать 2

Если я помещаю данные в текстовый файл и отлаживаю данные, это сработает, если я сделаю следующее.

конец канала выглядит так:

"Lng": "- 0.277833998203278", ""}]}

Если я удалю, и "", то это сработает. но как я могу остановить это, получая там в первую очередь?

Ответы [ 2 ]

0 голосов
/ 02 апреля 2012

Исключение может быть вызвано отсутствием атрибутов [DataContract] и [DataMember], в частности класса Stops. За исключением Silverlight 5, DataContract является опциональной моделью, где все классы и свойства, которые должны быть сериализованы, должны иметь явный атрибут.

Обновление

После вашего комментария я более подробно изучил данные JSON, которые вы получаете. Вы предоставляете две части JSON. В сочетании они выглядят так:

{
    "RouteId": "1231",
    "RouteName": "1 Whitehawk - Mile Oak",
    "Stops": [
        {
            "StopId": "6882",
            "StopName": "Swanborough Drive",
            "OperatorsCode4": "bridmpj",
            "Lat": "50.8326729229821",
            "Lng": "-0.103217996656901"
        },
        {
            "StopId": "6883",
            "StopName": "Haybourne Road",
            "OperatorsCode4": "brimapm",
            "Lat": "50.8317788816436",
            "Lng": "-0.10486427645364671"
        },
        {
            "StopId": "6884",
            "StopName": "Coolham Drive",
            "OperatorsCode4": "brijtwm",
            "Lat": "50.829695439856089",
            "Lng": "-0.10512229365031489"
        },
        {
            "StopId": "6885",
            "StopName": "St Cuthmans Church",
            "OperatorsCode4": "briapdg",
            "Lat": "50.8283233642578",
            "Lng": "-0.277833998203278",
            ""
        }
    ]
}

Боюсь, это просто неверно для JSON. Как вы сами узнали, есть дополнительная запятая и лишняя пара кавычек ближе к концу. Они делают разницу между правильным и недействительным JSON. Вы можете проверить это с помощью только валидатора JSON, например JSONLint .

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

0 голосов
/ 02 апреля 2012

ReadObject() принимает поток (или некоторые связанные с XML типы), но e.Result относится к типу объекта.

Попробуйте:

RootContainer2 rootContainer = ser.ReadObject((Stream)e.Result) as RootContainer2;

Редактировать: Если подумать, это, вероятно, вызовет исключение Invalid Parameter, а не Invalid Cast.

Похоже, что объект, возвращаемый ReadObject(), не может быть преобразован в тип RootContainer2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...