2013-07-03 93 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