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() の部分で例外がスローされます。

だから私が欲しいのはこれです:プロパティの1つに対して例外がスローされたとき、それを空の文字列にしたいだけです。しかし、私はこれを達成するためのきれいな方法を知りません。

私は複数のことを試しました:

  • すべてを try キャッチ内にラップしましたが、どのプロパティが空だったのかわからないため、空の文字列で「埋める」ことはできません。
  • 安全なキャスト (「文字列として」) を使用しようとしましたが、その操作は SelectToken() では使用できません。
  • とにかくうまくいかなかった他のいくつかのこと。

もちろん、すべての操作を独自の try catch 内に配置することもできますが、この状況では 5 つの try catch ブロックが発生するため、それは私が探しているものではありません。

これを解決するクリーンな方法を誰が知っていますか? ところで。Google ブックス API は単純なエンティティに適切にマップされないため (JSON には多くのネストが含まれます)、LINQ to 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 に答える