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 を直接具体化する代わりに使用することにしました。