经过长时间搜索好JSON
库后,我找到了Newtownsoft.json
,所以我开始用它来解码我从网页请求中获得的json文本,我不知道如果正确解码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().items
或rq.request()["items"]
,我还在学习c#,我想知道如何访问json对象成员正确的方式。
注意: 这是我正在开发的第一个桌面程序,我是一个php / nodejs开发人员,我想创建一个将连接到的应用程序堆栈交换数据库并检索用户的信息。
答案 0 :(得分: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包含名为&#39; 名称的字符串&#39;并且 int 被称为&#39; 年龄&#39;,写一个类似这样的类:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
然后像这样调用request
Person myPerson = rq.request<Person>();
并且您将留下Person
的实例名称和年龄属性