如何从Httpclient解析json字符串

时间:2016-09-13 10:43:40

标签: c# json json.net httpclient

您好我通过调用外部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": [
          {
            "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"
  }
}}

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

4 个答案:

答案 0 :(得分:22)

有三种方式可以想到。

  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"]
    

答案 1 :(得分:8)

编辑:

导入Newtonsoft.Json

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

答案 2 :(得分:7)

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

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

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

答案 3 :(得分:1)

使用:

using Newtonsoft.Json;

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

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

注意:这要求响应内容的内容类型为“ application / json”。