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

标签 c# json json.net

我正在尝试使用 fanart.tv Webservice 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()));
        }
      }
    }
  }

当有响应时工作正常,但如果没有拇指,则网络服务返回 null 并且此代码失败并显示

Unable to cast object of type 'Newtonsoft.Json.Linq.JValue' to type 'Newtonsoft.Json.Linq.JObject'.

让事情变得稍微复杂一些,我有点受到应用程序的限制,理想情况下我需要使用

JsonConvert.DeserializeObject<TE>(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; }
}

然后您可以像这样反序列化它(其中 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

.

关于c# - 处理 fanart.tv Web 服务响应 JSON 和 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17454055/

相关文章:

jquery - 使用 .each() 动态创建 JSON 数组

c# - 在 C# 控制台应用程序中获取 google 驱动程序中文件的 downloadUrl

javascript - 如何使用 Angular 2 通过选择/下拉菜单过滤数据?

sql - Postgres Json(b) int 数组包含任何数组值

c# - 将Json String反序列化为多种Object类型

c# - 至少一个对象必须实现 IComparable 调用 OrderBy()

c# - Entity Framework 选择上个月记录

c# - 检索 Windows 8 产品 key

c# - Azure DocumentDb错误 "Query must evaluate to IEnumerable"

c# - Json.NET Uri(反)序列化错误