我从http://www.viki.com/api/v2/channels.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获得这些值吗?
您不需要第二个反序列化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();
}
使用DataContracts和使用DataContractJsonSerializer 不是更容易吗
到目前为止,我只将它用于从文件中的JSON对象进行反序列化,但它非常简单。
只需使用atribute[DataContract]和每个应该使用[DataMember]反序列化的成员声明Class
例如(根据我的代码)
[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将递归地构建整个对象,包括数组、列表和字典。
最佳Thomas