2016-05-24 156 views
-1

這是我使用的反序列化JSON.But當我嘗試在控制檯寫它的代碼,它說:「System.Collections.Generic.Dictionary`2 [System.String,System.Object的]」如何反序列化Json對象?

System.Net.WebClient wc = new System.Net.WebClient(); 
string Jayson = wc.DownloadString("http://api.urbandictionary.com/v0/define?term=api"); 
object obj = JsonHelper.Deserialize(Jayson); 
Dictionary<string, object> values = 
     JsonConvert.DeserializeObject<Dictionary<string, object>>(Jayson); 
Console.WriteLine(values); 

我如何反序列化它並從JSON中只提取「定義」?

+0

你能提供「傑森」的樣本價值? –

+0

如果你打開http://api.urbandictionary.com/v0/define?term=api,你可以看到所有的JSON。我想提取「:[{」definition「: –

+0

這不是一個關於試圖寫一個字典的問題嗎?像values.ToList().ForEach(x => Console.WriteLine(x.Key)); – Mulflar

回答

2

您可以創建一些具體類型映射到和使用這些,而不是更通用的類型反序列化,例如:

public class Result 
{ 

    [JsonProperty("definition")] 
    public string Definition { get; set; } 

    [JsonProperty("author")] 
    public string Author { get; set; } 

    [JsonProperty("permalink")] 
    public string PermaLink { get; set; } 

} 

public class Results 
{ 

    [JsonProperty("list")] 
    public List<Result> List { get; set; } 

    [JsonProperty("tags")] 
    public List<string> Tags { get; set; } 

} 

然後:

var results = JsonConvert.DeserializeObject<Results>(json); 

然後,您可以遍歷的定義:

foreach(var result in results.List) 
    Console.WriteLine(result.Definition); 

Json.NET將忽略其無法映射的其他屬性,因此您可以添加/刪除他們根據需要。

+0

「 錯誤\t CS1579 \t foreach語句無法對'結果'類型的變量進行操作,因爲'結果'不包含'GetEnumerator'的公共定義'\t」 –

+0

「還有一個問題。 ..鏈接中顯然有多個定義,我怎樣才能得到第一個,而忽略其餘的呢? –

0

只要您解析JSON字符串到JObject,然後從它

jObj = JObject.Parse("yourJsonString");  
string defenition = jo["definition"]; 
1

你得到「System.Collections.Generic.Dictionary`2 [System.String,系統獲得 「defenition」 屬性。對象]「,因爲Console.WriteLine只能寫字符串,並不知道如何將字典轉換爲字符串。

要打印的所有條目,遍歷集合,並打印出每個條目:

System.Net.WebClient wc = new System.Net.WebClient(); 
string Jayson = wc.DownloadString("http://api.urbandictionary.com/v0/define?term=api"); 
object obj = JsonHelper.Deserialize(Jayson); 
Dictionary<string, object> values = 
     JsonConvert.DeserializeObject<Dictionary<string, object>>(Jayson); 

foreach(var entry in values) 
{ 
    Console.WriteLine($"{entry.Key} : {entry.Value}"); 
}