如何从 HttpClient 解析 JSON 字符串?

Posted

技术标签:

【中文标题】如何从 HttpClient 解析 JSON 字符串?【英文标题】:How can I parse JSON string from HttpClient? 【发布时间】: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 可能不在线程应用程序上下文中。 【参考方案1】:

我想到了三种方法。

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

    然后调用:

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

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

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

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

    并访问以下属性:

    obj.dialog.prompt;
    

    您可以使用 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"。

【讨论】:

以上是关于如何从 HttpClient 解析 JSON 字符串?的主要内容,如果未能解决你的问题,请参考以下文章

调用接口,解析Json字符串并存入数据库

从统一 C# POST json 字符串到 webAPI; HttpClient 还是 UnityWebRequest?

Json.net 从 HTTPClient 结果反序列化 DateTime

C# 使用 HttpClient 从 JSON 响应中获取特定对象

Spark:如何从 Spark 数据帧行解析和转换 json 字符串

如何快速从 HttpClient 返回的 JSON 中获取部分属性?