【问题标题】:How to parse JSON data that doesn't have a title using Json.NET如何使用 Json.NET 解析没有标题的 JSON 数据
【发布时间】:2018-10-17 15:53:39
【问题描述】:

我有一些 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();
    }

但是当我取消注释解析行时,我只会得到一个错误。

任何帮助将不胜感激。

【问题讨论】:

  • 为什么不直接反序列化为具有 3 个属性的自定义类?
  • 你没有数组,只使用JObject。
  • @maccettura 因为我是一个不知道如何操作的 c# 菜鸟。当我用谷歌搜索如何做到这一点时,我一直被定向到 Json.Net。最简单的就是我所追求的。
  • @onTheInternet This page 在文档中应该是你所需要的全部
  • 投反对票的能解释一下吗?我相信我已经遵守了规则,当然可以说像我这样的其他新手会发现这些信息很有价值。

标签: c# json


【解决方案1】:

创建一个类

[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);

【讨论】:

  • 我赞成,因为即使我没有使用此解决方案,我也对其进行了测试并发现它有效。所以这是很好的信息。
  • 我认为属性是[JsonProperty("someName")]
  • @maccettura 你是对的,它适用于JsonProperty。然而,这也适用于来自System.Runtime.SerializationDataMember属性
【解决方案2】:

如果您正在做一些简单的事情,例如从 JSON 中获取一个值,您可能只想:

string thejson = @"{
  ""error_code"": 0,
  ""access_token"": ""*******************"",
  ""expires_in"": 7200
}";

JObject jobj = JObject.Parse(thejson);

string theToken = jobj["access_token"].ToString();

【讨论】:

    【解决方案3】:

    您可以使用动态对象来获得更简洁的解决方案:

    string thejson = @"{
    ""error_code"": 0,
    ""access_token"": ""*******************"",
    ""expires_in"": 7200
    }";
    
    dynamic data = Json.Decode(thejson);
    
    string theToken = data.access_token;
    

    您将需要 System.Web.Helpers

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      • 2013-03-21
      • 2010-09-28
      • 2012-03-23
      相关资源
      最近更新 更多