2015-02-14 3 views
0

Итак, у меня есть google spreedsheet, откуда я читаю некоторые данные. Так, например, мой первый столбец выглядит примерно так:Сбой приложения при чтении номера в строке

enter image description here

При изменении любого из строк в некоторую случайную строку, как «ABC» мои падения приложения: enter image description here

Я также записал короткий видео, где я демонстрирую это в действии, и поместите свой метод в TRY-CATCH, чтобы приложение не разбилось. Это очень странно ... Возможно, это из-за переменной var где, если половина массива данных является целым числом, то она становится int или что еще может быть?

http://screencast.com/t/7OlDOzDZX70R

Если я, например, поместить все строки в некоторых строках «а», «б» и вставить номер между ними, приложение падает снова ...

enter image description here

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

отчет аварии enter image description here

Вот мой код, который deserilazes в JSON, когда я получаю его от сети:

private async Task GetDataAsync() 
    { 
     //if (this._table.Count != 0) return; 

     this.Table.Clear(); 
     var jsonObject = await DownloadSpreadsheet.GetJson(); 
     for (int row = 0; row < jsonObject["rows"].Count(); row++) 
     { 

      Table table = new Table(); 

      table.Day = jsonObject["rows"][row]["c"][0]["v"].ToString(); 

      table.Month = jsonObject["rows"][row]["c"][5]["v"].ToString(); 
      table.Year = jsonObject["rows"][row]["c"][6]["v"].ToString(); 
      table.People = jsonObject["rows"][row]["c"][7]["v"].ToString(); 


      this.Table.Add(table); 
     } 

А вот модель, в которой все поля четко объявлены как STRING ...

public class Table 
{ 
    [DataMember(Name="id")] 
    public string Id { get; set; } 
    [DataMember(Name="day")] 
    public string Day { get; set; } 
    [DataMember(Name="month")] 
    public string Month { get; set; } 
    [DataMember(Name="year")] 
    public string Year { get; set; } 
} 

Здесь также метод для получения JSON:

public class DownloadSpreadsheet 
{ 
    // 1tJ64Y8hje0ui4ap9U33h3KWwpxT_-JuVMSZzxD2Er8k 
    private static readonly string spreadsheetKey = "1Ka-8bTSo4E7sNmsP41prSQqpjawooAvajnFnLi-jtCI"; 
    private static string jsonUrlTemplate = "http://spreadsheets.google.com/a/google.com/tq?key={0}"; 
    async public static Task<JObject> GetJson() 
    { 
     var url = string.Format(jsonUrlTemplate, spreadsheetKey); 
     var client = new HttpClient(); 
     var response = await client.GetAsync(new Uri(url)); 
     var rawResult = await response.Content.ReadAsStringAsync(); 
     int start = rawResult.IndexOf("{", rawResult.IndexOf("{") + 1); 
     int end = rawResult.LastIndexOf("}"); 
     String jsonResponse = rawResult.Substring(start, end - start); 
     return JObject.Parse(jsonResponse); 
    } 
} 
+0

Чтобы ответить на ваш вопрос, было бы полезно знать: какая авария? Какое исключение выбрано? Какая строка, если вы знаете? –

+0

Какая структура json будет возвращена на 'DownloadSpreadsheet.GetJson();' в которой строка сбой вашего приложения? –

+0

Я добавил отчет о сбое – klanc

ответ

0

Ошибка поиска или проверки нулевых значений в любом месте кода и неизвестной ошибки.

Я съехал свой код в LINQPad и я получаю исключение на этой линии:

var result = jsonObject.Result; 

    for (int row = 0; row < result["rows"].Count(); row++) 
    {  
     table.Day = result["rows"][row]["c"][0]["v"].ToString(); // Exception here 

исключение составляет этот

InvalidOperationException: Не удается получить доступ к ценности ребенка на Newtonsoft.Json.Linq .JValue.

Я рекомендую ставить проверку ошибок в код и способ, чтобы увидеть сообщение, такие как:

private async Task GetDataAsync() 
{ 
     //if (this._table.Count != 0) return; 
    try 
    { 
     this.Table.Clear(); 
     var jsonObject = await DownloadSpreadsheet.GetJson(); 
     for (int row = 0; row < jsonObject["rows"].Count(); row++) 
     { 

      Table table = new Table(); 

      table.Day = jsonObject["rows"][row]["c"][0]["v"].ToString(); 

      table.Month = jsonObject["rows"][row]["c"][5]["v"].ToString(); 
      table.Year = jsonObject["rows"][row]["c"][6]["v"].ToString(); 
      table.People = jsonObject["rows"][row]["c"][7]["v"].ToString(); 


      this.Table.Add(table); 
     } 
     } 
    catch(Exception ex) 
    { this.Error = ex; } 
} 

Еще одна вещь, в моей версии кода я должен был отработать из результат задачи jsonObject.Result перед извлечением данных.

+0

Я использовал try-catch и добавил видео, чтобы вы могли взглянуть, если у вас есть время. Я действительно в отчаянии, почему это происходит ... – klanc

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