我正在查询 Google Books API,我正在将这些书籍解析为一个自定义对象,如下所示:
foreach (JToken item in items)
{
try
{
FoundBookViewModel viewModel = new FoundBookViewModel
{
Title = item.SelectToken("volumeInfo.title").ToString(),
Isbn13 = item.SelectToken("volumeInfo.industryIdentifiers[1].identifier").ToString(),
Authors = item.SelectToken("volumeInfo.authors").Select(x => x.ToString()).ToList().Aggregate((i, j) => i + ", " + j),
Pages = item.SelectToken("volumeInfo.pageCount").ToString(),
ImageUri = item.SelectToken("volumeInfo.imageLinks.smallThumbnail").ToString()
};
newList.Add(viewModel);
}
catch (Exception)
{
newList.Add(new FoundBookViewModel());
}
}
但是,有时并非所有数据都可用。有时没有“pageCount”,有时没有“ISBN13”等。在这些情况下,ToString() 部分会引发异常。
所以我想要的是:当某个属性抛出异常时,我只希望它是一个空字符串。但我不知道一个干净的方法来完成这个。
我尝试了多种方法:
- 我将整个东西包裹在一个 try catch 中,但是我不知道什么属性是空的,所以我不能用空字符串“填充”它。
- 我尝试使用安全转换('as string'),但该操作在 SelectToken() 上不可用。
- 其他几件无论如何都不起作用的事情。
当然,我可以将每个操作放在它自己的 try catch 中,但是在这种情况下会导致 5 个 try catch 块,所以这不是我想要的。
谁知道解决这个问题的干净方法?顺便提一句。我选择使用 LINQ to JSON 而不是直接实现它,因为 Google Books API 不能巧妙地映射到简单实体(JSON 包含大量嵌套)。