如何从复杂JSON对象中获取值

时间:2012-08-29 05:53:10

标签: c# .net json json.net

我从http://www.viki.com/api/v2/channels.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获取这些值吗?

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

使用DataContracts并使用DataContractJsonSerializer

这不是一种更简单的方法

到目前为止,我只使用了来自文件的JSON对象的反序列化,但它很容易。

使用atribute [DataContract]声明Class,并使用[DataMember]

反序列化每个成员

e.g。 (来自我的代码)

[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将以递归方式构建整个Object,包括Arrays,Lists,Dictionarys。

最佳

托马斯