如何从 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 字符串?的主要内容,如果未能解决你的问题,请参考以下文章
从统一 C# POST json 字符串到 webAPI; HttpClient 还是 UnityWebRequest?
Json.net 从 HTTPClient 结果反序列化 DateTime
C# 使用 HttpClient 从 JSON 响应中获取特定对象