2

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);

問題は、これらの問題の両方を解決するための最善のアプローチは何かということです。

4

1 に答える 1

2

これを試して:

まず、JSON から逆シリアル化されたデータを保持するオブジェクトを定義します。

class Artist
{
    public Guid mb_id { get; set; }
    public List<Thumb> artistthumb { get; set; }
}

class Thumb
{
    public int id { get; set; }
    public string url { get; set; }
    public int likes { get; set; }
}

次に、次のように逆シリアル化できます (jsonは Web サービスからの JSON データを含む文字列です)。

Dictionary<string, Artist> artists = 
          JsonConvert.DeserializeObject<Dictionary<string, Artist>>(json);

逆シリアル化すると、次のようにデータにアクセスできます。

foreach (KeyValuePair<string, Artist> kvp in artists)
{
    Console.WriteLine("Urls for " + kvp.Key + ":");
    foreach (Thumb thumb in kvp.Value.artistthumb)
    {
        Console.WriteLine(thumb.url);
    }
}

質問で示したデータを仮定すると、出力は次のようになります。

Urls for Metallica:
http://assets.fanart.tv/fanart/music/65f4f0c5-ef9e-490c-aee3-909e7ae6b2ab909e7ae6b2ab/artistthumb/metallica-4fd83b0129f83.jpg

.

于 2013-07-03T19:43:25.650 に答える