我正在尝试使用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()));
}
}
}
}
当有响应时工作正常但是如果没有拇指,则web-service返回null并且此代码失败,
Unable to cast object of type 'Newtonsoft.Json.Linq.JValue' to type 'Newtonsoft.Json.Linq.JObject'.
稍微使问题复杂化我受应用程序的限制,理想情况下我需要使用
JsonConvert.DeserializeObject<TE>(json);
所以问题是什么是解决这两个问题的最佳方法是什么?
答案 0 :(得分:1)
试试这个:
首先,定义对象以保存从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