应用程序在读取字符串中的数字时崩溃

时间:2015-02-14 19:54:10

标签: c# windows-phone-8

所以我有一个google spreedsheet,我从那里读取一些数据。因此,例如我的第一列看起来像这样:

enter image description here

当我将任何行更改为一些随机字符串时,如" abc"我的应用程序崩溃: enter image description here

我还录制了一段简短的视频,我在其中演示了这一点,并将我的方法放在TRY-CATCH中,以便应用程序不会崩溃。这很奇怪......是不是因为变量 var ,如果数据数组的一半是整数值,那么它会变成int还是其他什么呢?

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

如果我,例如将所有行放在某些字符串中" a"," b"并在其间插入一个数字,应用程序再次崩溃......

enter image description here

我只是不知道可能是什么问题。它也发生在其他行......

崩溃报告 enter image description here

这是我的代码,当我从网上获取json时,它会对json进行deserila:

  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);
    }
}

1 个答案:

答案 0 :(得分: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的结果。