2014-11-24 52 views
1

经过长时间搜索良好的JSON库后,我发现Newtownsoft.json,所以我开始使用它来解码从Web请求获取的json文本,我不知道是否JSON是被正确C#访问json解码后的对象属性

解码类:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
//Request library 
using System.Net; 
using System.IO; 
using Newtonsoft.Json; 


namespace TestApplication 
{ 
    class Connect 
    { 
     public string id; 
     public string type; 

     private string api = "https://api.stackexchange.com/2.2/"; 
     private string options = "?order=desc&sort=name&site=stackoverflow"; 

     public object request() 
     { 
      string totalUrl = this.join(id); 

      string json = this.HttpGet(totalUrl); 

      return this.decodeJson(json); 
     } 

     private string join(string s) 
     { 
      return api + type + "/" + s + options; 
     } 

     private string HttpGet(string URI) 
     { 
      string html = string.Empty; 
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URI); 
      request.AutomaticDecompression = DecompressionMethods.GZip; 
      request.ContentType = "application/json; charset=utf-8"; 

      using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
      using (Stream stream = response.GetResponseStream()) 
      using (StreamReader reader = new StreamReader(stream)) 
      { 
       html = reader.ReadToEnd(); 
      } 

      return html; 
     } 

     private object decodeJson(string json) 
     { 
      object js = JsonConvert.DeserializeObject(json); 

      return js; 
     } 
    } 
} 

类对象正在从形式,以这种方式访问​​:

Connect rq = new 
rq.id = usernameText.Text; 
rq.type = "users"; 
Debug.WriteLine(rq.request()); 

我不知道为什么我不能做rq.request().itemsrq.request()["items"],我仍然在学习c#,我想知道如何以正确的方式访问json对象成员。

注:这是国内第一款桌面程序我发展,我是一个PHP /开发商的NodeJS,我想使将要连接到堆栈Exchange数据库和检索用户的信息的应用程序。

+0

http://stackoverflow.com/questions/2546138/deserializing-json-data-to-c-sharp-using-json-net – 2014-11-24 20:17:02

回答

3

您的请求方法的返回类型为object,因此返回的实例不会有名为items的属性。

您需要使用泛型方法并指定正确的类型参数。

试着改变你的decodeJson方法是:

private T decodeJson<T>(string json) 
{ 
    var js = JsonConvert.DeserializeObject<T>(json); 

    return js; 
} 

,然后改变你的要求的方法是:

public T request<T>() 
{ 
    string totalUrl = this.join(id); 

    string json = HttpGet(totalUrl); 

    return decodeJson<T>(json); 
} 

现在写了一类具有匹配属性的名称和类型的属性在从Web请求返回的JSON中。

然后指定这个新类的类型作为调用request方法的类型参数。

例如,如果您预期的JSON包含一个字符串称为“名称”和INT称为“年龄”,写一个类,它是这样的:

public class Person 
{ 
    public string Name { get; set; } 

    public int Age { get; set; } 
} 

,然后调用request这样

Person myPerson = rq.request<Person>(); 

,你会b离开e为的Person实例与名称年龄性能

+0

您方法似乎是有效的,我试图从堆栈交换api获取数据,它有一个“项目”作为数组与对象内我正在哪里有兴趣收集,我将如何访问该数据? – nosthertus 2014-11-24 23:55:30

+0

在数组中的每个项目中找到了什么类型的数据? – lockstock 2014-11-25 01:21:44

+0

其中之一是一个对象,其余的是大多数int,一些字符串 – nosthertus 2014-11-25 01:24:45