如何使用Json.NET解析没有标题的JSON数据

onT*_*net 1 c# json

我有一些C#代码使HTTP Web请求获取访问令牌.该对象以下列格式返回:

{
  "error_code": 0,
  "access_token": "*******************",
  "expires_in": 7200
}
Run Code Online (Sandbox Code Playgroud)

我目前正在将请求设置为字符串对象并进行修剪.但这似乎很脆弱,容易失败.我想像这样抓住令牌.

string myToken = httpWebResponse.access_token

所以我在看到这个堆栈溢出帖后开始研究Json.NET.

在C#中解析Json休息api响应

这正是我想要做的.但是,我似乎无法遵循他接受的答案,因为他的回答对象有一个标题("回应"),而我的回答没有.

我决定查看文档以找到答案,我也在那里找到答案. 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();
    }
Run Code Online (Sandbox Code Playgroud)

但是,当我取消注释解析行时,我只会收到错误.

任何帮助将不胜感激.

Ale*_*eev 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; }
}
Run Code Online (Sandbox Code Playgroud)

并将您的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);
Run Code Online (Sandbox Code Playgroud)