2016-05-24 200 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}"); 
}