处理fanart.tv Web服务响应JSON和C#

处理fanart.tv Web服务响应JSON和C#,c#,json,json.net,C#,Json,Json.net,我正在尝试使用fanart.tv Web服务API,但有几个问题。 我使用的是Json.Net(Newtonsoft.Json)和其他web服务,我将Json响应直接反序列化为C#对象 这里的问题是元素名称正在更改。如果我为Metallica搜索艺术家的拇指,你会得到 {"Metallica":{"mbid_id":"65f4f0c5-ef9e-490c-aee3-909e7ae6b2ab","artistthumb": [{"id":"36181","url":"http://a

我正在尝试使用fanart.tv Web服务API,但有几个问题。 我使用的是Json.Net(Newtonsoft.Json)和其他web服务,我将Json响应直接反序列化为C#对象

这里的问题是元素名称正在更改。如果我为Metallica搜索艺术家的拇指,你会得到

{"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"},...]}}
所以根元素叫做Metallica。显然,搜索另一个艺术家,你会得到一个不同的元素名称。在尝试将其反序列化到一个对象之后,我放弃了,实际上我所需要的只是一个字符串列表(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()));
        }
      }
    }
  }
让事情稍微复杂一点,我有点受应用程序的限制,理想情况下我需要使用

JsonConvert.DeserializeObject<TE>(json);
JsonConvert.DeserializeObject(json);
因此,问题是解决这两个问题的最佳方法是什么?

尝试以下方法:

首先,定义对象以保存从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; }
}
反序列化后,您可以如下方式访问数据:

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

.

您获取的数据实际上由一个带有单个键的字典组成:
Metallica
,该值包含所有其余数据。
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