2012-08-29 97 views
0

我正在從http://www.viki.com/api/v2/channels.json如何從複雜的JSON對象

的JSON請求現在,我有以下類從JSON獲得的價值:

public class RootObject 
{ 
    public int id { get; set; } 
    public string title { get; set; } 
    public string description { get; set; } 
    public string uri { get; set; } 
    public List<Episode> episodes { get; set; } 
    public Thumbnails2 thumbnails { get; set; } 
    public string timestamp { get; set; } 
    public List<object> genres { get; set; } 
    public string origin_code { get; set; } 
} 

public class Thumbnails2 
{ 
    public string c_220_160 { get; set; } 
    public string c_102_102 { get; set; } 
    public string c_180_130 { get; set; } 
    public string c_110_80 { get; set; } 
    public string xl { get; set; } 
    public string large { get; set; } 
    public string medium { get; set; } 
    public string small { get; set; } 
    public string c_320_300 { get; set; } 
    public string c_640_600 { get; set; } 
    public string c_95_70 { get; set; } 
    public string c_190_140 { get; set; } 
    public string c_280_200 { get; set; } 
    public string c_560_400 { get; set; } 
} 

現在我想從價值Thumbnails2中的大型和中型以及List中的所有情節。

我試着用:

using (var wc = new WebClient()) 
{ 
    var json = wc.DownloadString(jsonRequestURL); 

    dynamic vikiDesrialized = JsonConvert.DeserializeObject(json); 
    foreach (var item in vikiDesrialized) 
    { 
    //Console.WriteLine(item.title); 

    foreach (var thumnails in item.thumbnails) 
    { 
      JsonConvert.DeserializeObject(thumbNails); 
    } 
    } 
} 

但是,讓這意味着別的異常:

Viki.MainWindow「構造對類型調用'符合指定綁定約束扔一個例外。「 行號「3」和行位置「9」。

我可以使用LINQ獲得這些值嗎?

+0

您的foreach循環拼寫錯誤。 – Slappy

回答

1

你不需要第二個反序列化JsonConvert.DeserializeObject(thumbNails);

要麼使用

foreach (var item in dynObj) 
{ 
    Console.WriteLine(item.title); 
    Console.WriteLine(item.thumbnails.small); 
} 

using (var wc = new WebClient()) 
{ 
    var json = wc.DownloadString("http://www.viki.com/api/v2/channels.json"); 
    var rootObj = JsonConvert.DeserializeObject<RootObject[]>(json); 

    var obj = rootObj.Select(r=>new 
       { 
        Title = r.title, 
        Thumbnail = r.thumbnails.small 
       }).ToArray(); 
} 
0

豈不是使用DataContracts並使用DataContractJsonSerializer

一個更簡單的方法

我已經使用它迄今只與德從文件中的JSON對象序列化,但它很容易。

只要申報與屬性附加傷害[DataContract]和各成員的類,應與[數據成員]

例如反序列化(從我的代碼)

[DataContract] 
public class CharacteristicManager 
{ 
    [DataMember(Order = 1)] 
    public Characteristic[] characteristics; 
    private Dictionary<String, Characteristic> characteristic_dictionary; 
} 

反序列化看起來是這樣的:

DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(CharacteristicManager)); 

CharacteristicManager cm = (CharacteristicManager)ser.ReadObject(stream); 

DataContractJsonSerializer將建立整個對象遞歸包括數組,列表,Dictionarys。

最佳 托馬斯