簡體   English   中英

如何從復雜的JSON對象獲取值

[英]How to get the value from a Complex JSON Object

我從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獲得這些值嗎?

您不需要第二個反序列化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對象進行反序列化一起使用,但是它是如此簡單。

只需使用屬性[DataContract]聲明類,並使用[DataMember]反序列化每個成員。

例如(從我的代碼)

[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將以遞歸方式構建整個對象,包括數組,列表,字典。

最佳托馬斯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM