1

我正在查询 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 包含大量嵌套)。

4

1 回答 1

5

如果您不想抛出异常 - 不要...

即您可以更改item.SelectToken("volumeInfo.pageCount").ToString()为:

item.SelectToken("volumeInfo.pageCount") == null? 
   String.Empty : item.SelectToken("volumeInfo.pageCount").ToString()
于 2012-05-15T00:11:02.867 回答