当数据不可用时,JSON.NET使用空字符串

时间:2012-05-15 00:07:19

标签: c# linq json.net

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

1 个答案:

答案 0 :(得分:5)

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

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

item.SelectToken("volumeInfo.pageCount") == null? 
   String.Empty : item.SelectToken("volumeInfo.pageCount").ToString()