fanart.tv Web サービス API を使用しようとしていますが、いくつか問題があります。私は Json.Net (Newtonsoft.Json) を使用しており、他の Web サービスを使用して、JSON 応答を C# オブジェクトに直接逆シリアル化しました。
ここでの問題は、要素名が変更されていることです。例えば。メタリカのアーティストの親指を検索すると、
{"Metallica":{"mbid_id":"65f4f0c5-ef9e-490c-aee3-909e7ae6b2ab","artistthumb": [{"id":"36181","url":"http://assets.fanart.tv/fanart/music/65f4f0c5-ef9e-490c-aee3-909e7ae6b2ab/artistthumb/metallica-4fd83b0129f83.jpg","likes":"1"},...]}}
そのため、ルート要素はメタリカと呼ばれます。明らかに別のアーティストを検索すると、別の要素名が表示されます。これをオブジェクトにデシリアライズしようとした後、あきらめましたが、実際には必要なのは文字列 (URL) のリストだけでした。JSON を処理しようとしました
var obj = _downloader.Download<JObject>(url);
if (obj != null)
{
if (obj.HasValues)
{
var fanartArtist = (JProperty)obj.First;
if (fanartArtist.HasValues)
{
var thumbs = fanartArtist.Value[SearchSubTypeToString(subType)];
if (thumbs.HasValues)
{
thumbUrls.AddRange(thumbs.Select(thumb => thumb["url"].ToString()));
}
}
}
}
応答がある場合は正常に動作しますが、親指がない場合、Web サービスは null を返し、このコードは失敗します
Unable to cast object of type 'Newtonsoft.Json.Linq.JValue' to type 'Newtonsoft.Json.Linq.JObject'.
少し複雑にするために、私はアプリケーションによって制限されており、理想的には使用する必要があります
JsonConvert.DeserializeObject<TE>(json);
問題は、これらの問題の両方を解決するための最善のアプローチは何かということです。