2012-04-02 2 views
0

Привет, Почему я получаю исключение исключения?Invalid Cast Exception, json, windows phone

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" } , 

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

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

EDIT:

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

Edit 2

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

конец корма, как это:

"ДЛН": "- +0,277833998203278", ""}]}

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

+1

Что такое * деталь * исключения? –

+0

Когда я отлаживаю его, когда он достигает конца этой строки: RootContainer2 rootContainer = ser.ReadObject (e.Result) как RootContainer2; он идет прямо в конец и показывает сообщение об ошибке, которое просто «InvalidCastException» –

+0

Это потому, что вы только показываете * сообщение * исключения. Вы должны иметь возможность получать больше информации, чем трассировку стека. –

ответ

0

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

Update:

После Вашего комментария, я посмотрел более подробно в данных 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. Вы можете проверить это с помощью onlne JSON validator, например JSONLint.

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

+0

Check Edit 2 для моего обновления –

+0

Привет, спасибо, положив результат в валидатор даже с дополнительными вещами в нем. но это не может быть с этим в конце -, "" –

0

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

Try:

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

Edit: На второй мысли, что, вероятно, бросить Invalid исключения параметров, а не недействительный Cast.

Похоже, объект возвращается ReadObject() не подлежит применению для литья под давлением RootContainer2.

+0

Он по-прежнему пропускает строки после этого и показывает сообщение об ошибке. –

+0

Да, понял после публикации, что это будет другая ошибка, если это так. Разве ваш класс RootContainer2 не имеет свойств для RouteId и RouteName вместо StopId и StopName? – Nomad101

+0

Я пытаюсь получить все остановки. –

Смежные вопросы