【问题标题】:How can I parse JSON string from HttpClient?如何从 HttpClient 解析 JSON 字符串?
【发布时间】:2016-09-13 10:43:39
【问题描述】:

我通过调用外部 API 获得 JSON 结果。

        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri(url);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        HttpResponseMessage response = client.GetAsync(url).Result;

        if (response.IsSuccessStatusCode)
        {
            var result  = response.Content.ReadAsStringAsync().Result;
            var s = Newtonsoft.Json.JsonConvert.DeserializeObject(result);
            return "Success";
        }
        else
        {
            return "Fail";
        }

我得到的var s = Newtonsoft.Json.JsonConvert.DeserializeObject(result); 行中的结果是这样的:

 {{
  "query": "1",
  "topScoringIntent": {
    "intent": "1",
    "score": 0.9978111,
    "actions": [
      {
        "triggered": false,
        "name": "1",
        "parameters": []
      }
    ]
  },
  "entities": [],
  "dialog": {
    "prompt": "1",
    "parameterName": "1",
    "parameterType": "1::1",
    "contextId": "11",
    "status": "1"
  }
}}

我正在使用HttpClient。我在访问prompt 键值时遇到了困难。我想从dialog 得到prompt。我怎样才能得到它?

【问题讨论】:

  • 请注意,您不应该在 client.GetAsync 上执行 .Result,因为这会阻塞线程。
  • OP 可能不在线程应用程序上下文中。

标签: c# json json.net httpclient


【解决方案1】:

我想到了三种方法。

  1. 假设 json 是一致的,并且响应的结构不会经常变化,我会使用 json2csharpjsonutils 之类的工具来创建 c# 类。

    然后调用:

    {GeneratedClass} obj = JsonConvert.DeserializeObject<{GeneratedClass}>(result);
    

    这将为您提供一个可以使用的强类型对象。

  2. 您可以跳过类生成并使用动态对象:

    dynamic obj = JsonConvert.DeserializeObject<dynamic>(result)
    

    并访问以下属性:

    obj.dialog.prompt;
    
  3. 您可以使用 JObject 并使用字符串访问其属性

    JObject obj = JsonConvert.DeserializeObject(result);
    
    obj["dialog"]["prompt"]
    

【讨论】:

  • 我认为第 3 点应该是 JObject obj = JObject.Parse(result);
【解决方案2】:

编辑:

导入 Newtonsoft.Json

JObject s = JObject.Parse(result);
string yourPrompt = (string)s["dialog"]["prompt"];

【讨论】:

    【解决方案3】:

    你想看看这里: http://www.newtonsoft.com/json/help/html/deserializeobject.htm

    创建一个与您的 XML 具有相同结构的类。那么你的变量s就是这个类的一个实例,你可以将json反序列化为类结构。

    在您的情况下,您的财产应该是s.dialog.prompt

    【讨论】:

    • 我猜这里提到的“XML”应该是“Json”。
    【解决方案4】:

    通过像这样安装 NuGet 包 Microsoft.AspNet.WebApi.Client:

    PM> Install-Package Microsoft.AspNet.WebApi.Client
    

    与:

    using Newtonsoft.Json;
    

    您可以通过直接将内容读取为 JObject 来节省一步:

    dynamic response = await response.Content.ReadAsAsync<JObject>();
    string prompt = response.dialog.prompt.ToString();
    

    注意:这要求响应内容是 Content-Type "application/json"。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-13
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多