所以我有一个google spreedsheet,我从那里读取一些数据。因此,例如我的第一列看起来像这样:
当我将任何行更改为一些随机字符串时,如" abc"我的应用程序崩溃:
我还录制了一段简短的视频,我在其中演示了这一点,并将我的方法放在TRY-CATCH中,以便应用程序不会崩溃。这很奇怪......是不是因为变量 var ,如果数据数组的一半是整数值,那么它会变成int还是其他什么呢?
http://screencast.com/t/7OlDOzDZX70R
如果我,例如将所有行放在某些字符串中" a"," b"并在其间插入一个数字,应用程序再次崩溃......
我只是不知道可能是什么问题。它也发生在其他行......
崩溃报告
这是我的代码,当我从网上获取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);
}
}
答案 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
的结果。