如何从Httpclient解析json字符串

Son*_*ali 18 c# json httpclient json.net

嗨我通过调用外部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";
        }
Run Code Online (Sandbox Code Playgroud)

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

 {{
  "query": "1",
  "topScoringIntent": {
    "intent": "1",
    "score": 0.9978111,
    "actions": [
      {
        "triggered": false,
        "name": "1",
        "parameters": [
          {
            "name": "1",
            "required": true,
            "value": null
          },
          {
            "name": "1",
            "required": true,
            "value": null
          },
          {
            "name": "1",
            "required": true,
            "value": null
          }
        ]
      }
    ]
  },
  "entities": [],
  "dialog": {
    "prompt": "1",
    "parameterName": "1",
    "parameterType": "1::1",
    "contextId": "11",
    "status": "1"
  }
}}
Run Code Online (Sandbox Code Playgroud)

我怎么能得到prompt'对话'?我正在使用http客户端.我在访问提示键值时遇到困难.我想从对话中得到提示.我怎么才能得到它?

Oma*_*abd 25

有三种方式可以想到.

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

    然后打电话:

    {GeneratedClass} obj = JsonConvert.DeserializeObject<{GeneratedClass}>(result);
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    dynamic obj = JsonConvert.DeserializeObject<dynamic>(result)
    
    Run Code Online (Sandbox Code Playgroud)

    和访问属性,如:

    obj.dialog.prompt;
    
    Run Code Online (Sandbox Code Playgroud)
  3. 您可以使用JObject并使用字符串访问其属性

    JObject obj = JsonConvert.DeserializeObject(result);
    
    obj["dialog"]["prompt"]
    
    Run Code Online (Sandbox Code Playgroud)

  • 我认为在第3点中,应该是 JObject obj = JObject.Parse(result); (4认同)

cem*_*zel 11

编辑:

导入Newtonsoft.Json

JObject s = JObject.Parse(result);
string yourPrompt = (string)s["dialog"]["prompt"];
Run Code Online (Sandbox Code Playgroud)


c0d*_*34n 10

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

创建一个与XML相同结构的类.然后你的变量s是这个类的一个实例,你可以将json反序列化为类结构.

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


DSp*_*rit 5

通过安装 NuGet 包 Microsoft.AspNet.WebApi.Client,如下所示:

PM> Install-Package Microsoft.AspNet.WebApi.Client
Run Code Online (Sandbox Code Playgroud)

和:

using Newtonsoft.Json;
Run Code Online (Sandbox Code Playgroud)

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

dynamic response = await response.Content.ReadAsAsync<JObject>();
string prompt = response.dialog.prompt.ToString();
Run Code Online (Sandbox Code Playgroud)

注意:这要求响应内容的Content-Type为“application/json”。