如何无需定义实体类从JSON响应中提取指定的单个字段值
解决方案
报错原因
你之前的代码报错是因为JObject.Parse(text).Children().First()获取到的是Transactions对应的JProperty属性节点,而非节点存储的交易数组值,直接调用Values<string>("Code")就会触发类型不匹配的异常。
无需定义实体类的正确写法
基于Newtonsoft.Json(你当前使用的库)
最简单的写法直接按JSON层级取值即可:
var content = new StringContent(request, Encoding.UTF8, "application/json"); var response = await HttpClient.PostAsync(postURL, content); var text = await response.Content.ReadAsStringAsync(); JObject jobj = JObject.Parse(text); // 直接取第一个交易的Code字段 string code = jobj["Transactions"][0]["Code"].ToString();
如果需要加空防护避免空引用异常,可以写为:
string code = jobj.Value<JArray>("Transactions")?.FirstOrDefault()?.Value<string>("Code"); // 取值失败时code为null,不会直接抛空引用
基于.NET自带System.Text.Json(无需引入第三方包)
如果你的项目是.NET Core 3.0+版本,可以用框架自带的JSON库实现,不需要额外安装Newtonsoft.Json:
using System.Text.Json; var content = new StringContent(request, Encoding.UTF8, "application/json"); var response = await HttpClient.PostAsync(postURL, content); var text = await response.Content.ReadAsStringAsync(); using JsonDocument doc = JsonDocument.Parse(text); string code = doc.RootElement .GetProperty("Transactions") .EnumerateArray() .First() .GetProperty("Code") .GetString();
内容的提问来源于stack exchange,提问作者Natali
相关产品推荐
相关产品推荐

