我如何从HttpClient解析JSON字符串

本文关键字:解析 JSON 字符串 HttpClient | 更新日期: 2023-09-27 18:06:58

我通过调用外部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。我怎样才能拿到呢?

我如何从HttpClient解析JSON字符串

我想到了三种方法。

  1. 假设json是一致的,响应的结构不会经常改变,我会使用json2sharp或jsonutils这样的工具来创建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"]
    

编辑:

进口Newtonsoft。Json

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

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

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

在你的例子中,你的属性应该是s.dialog.prompt

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

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

:

using Newtonsoft.Json;

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

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

注意:这要求响应内容为content - type "application/json"