2012-08-29 79 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。

最佳 托马斯