2013-07-03 51 views
2

我想使用fanart.tv webservice API,但有几个问题。 我正在使用Json.Net(Newtonsoft.Json)和其他Web服务,我已经反序列化JSON直接回应到C#对象。处理fanart.tv webservice响应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。显然搜索另一个艺术家,你会得到不同的元素名称。试图反序列化这一个对象后,我放弃了,因为在现实中,所有我需要的是字符串(网址)的列表,我尝试处理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); 

所以问题是什么是解决这两个问题的最佳方法?

+1

您获得的数据实际上由一个带有单个键的字典组成:“Metallica”,其值包含所有其余数据。 – Bobson

回答

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是包含从JSON数据字符串Web服务):

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 

+0

谢谢你这样做。 –

+0

检索json的好方法,谢谢 – LXG