我有一些C#代码,可以发出HTTP Web请求来获取访问令牌。该对象以以下格式返回:
{
"error_code": 0,
"access_token": "*******************",
"expires_in": 7200
}
我当前正在将请求设置为字符串对象并进行修剪。但这似乎很脆弱,容易失败。我只想像这样抓住令牌。
字符串myToken = httpWebResponse.access_token
因此,看到此堆栈溢出后,我开始研究Json.NET。
Parsing Json rest api response in C#
这正是我想要做的。但是,我似乎无法遵循他接受的答案,因为他的响应对象带有标题(“响应”),而我的却没有。
我决定查看文档以找到答案,我在那里也很短。 https://www.newtonsoft.com/json/help/html/SerializingJSONFragments.htm
他的回答带有标题,在这种情况下为“结果”。
这是我的C#代码。
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + appId + "&secret=" + secret);
request.Method = "GET";
request.KeepAlive = false;
request.ContentType = "appication/json";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
/*
JSON Parse Attempt
JObject joResponse = JObject.Parse(response.ToString());
JArray array = (JArray)joResponse[""];
int id = Convert.ToInt32(array[0].ToString());
*/
//////////////////////////
string myResponse = "";
using (System.IO.StreamReader sr = new System.IO.StreamReader(response.GetResponseStream()))
{
myResponse = sr.ReadToEnd();
}
return myResponse;
}
catch (Exception e)
{
return e.ToString();
}
但是当我取消注释解析行时,我只会得到一个错误。
任何帮助将不胜感激。
答案 0 :(得分:5)
创建课程
[DataContract]
public class Response
{
[DataMember(Name = "error_code")]
public int ErrorCode { get; set; }
[DataMember(Name = "access_token")]
public string AccessToken { get; set; }
[DataMember(Name = "expires_in")]
public int ExpiresIn { get; set; }
}
并将您的json反序列化为强类型对象:
var json =
"{\r\n \"error_code\": 0,\r\n \"access_token\": \"*******************\",\r\n \"expires_in\": 7200\r\n}";
var response = JsonConvert.DeserializeObject<Response>(json);
Console.WriteLine(response.AccessToken);
答案 1 :(得分:3)
如果您做的事情像从JSON中获取一个值一样简单,则可能需要简单地做到:
{{1}}
答案 2 :(得分:1)
您可以将动态对象用于更清洁的解决方案:
string thejson = @"{
""error_code"": 0,
""access_token"": ""*******************"",
""expires_in"": 7200
}";
dynamic data = Json.Decode(thejson);
string theToken = data.access_token;
您将需要System.Web.Helpers