在C#中使用HttpResponseMessage读取Web API JSON响应及错误解决
问题分析与解决方案
核心问题
- 响应格式不规范:你拿到的API返回是多个独立JSON对象用逗号分隔,但未用数组
[]包裹,且属性名(如c、d)没有双引号,不符合标准JSON规范,导致默认序列化器无法解析。 - 类型不匹配:你用
Dictionary<string, string>接收单个键值对对象,但实际返回的是多个对象的集合,类型不匹配必然报错。
解决步骤
1. 优先修正API响应格式(若有权限)
让API返回标准JSON数组,属性名添加双引号:
[ {"c":"2099", "d":"A0", "e":"01", "f":"01", "p":"A00101.0", "v":"0"}, {"c":"2093", "d":"A1", "e":"02", "f":"02", "p":"A00101.2", "v":"1"}, {"c":"2012", "d":"A2", "e":"03", "f":"03", "p":"A00101.3", "v":"2"}, {"c":"2133", "d":"A3", "e":"04", "f":"04", "p":"A00101.4", "v":"3"}, {"c":"2432", "d":"A4", "e":"05", "f":"05", "p":"A00101.5", "v":"4"} ]
2. 定义匹配的数据模型类
创建与返回对象结构对应的实体类:
public class DataItem { public string c { get; set; } public string d { get; set; } public string e { get; set; } public string f { get; set; } public string p { get; set; } public string v { get; set; } }
3. 正确读取标准JSON响应
修改代码用集合接收,且用await替代.Result避免死锁:
var dataObjects = new List<DataItem>(); try { using (HttpClient client = new HttpClient()) { client.BaseAddress = new Uri(url); HttpResponseMessage response = await client.GetAsync("get").ConfigureAwait(false); if (response.IsSuccessStatusCode) { dataObjects = await response.Content.ReadAsAsync<List<DataItem>>().ConfigureAwait(false); } } } catch (Exception ex) { // 这里添加异常处理逻辑,比如日志记录 }
4. 无法修改API时的兼容处理
如果API无法调整格式,手动修正非标准JSON后再序列化:
var dataObjects = new List<DataItem>(); try { using (HttpClient client = new HttpClient()) { client.BaseAddress = new Uri(url); HttpResponseMessage response = await client.GetAsync("get").ConfigureAwait(false); if (response.IsSuccessStatusCode) { // 读取原始响应字符串 string rawContent = await response.Content.ReadAsStringAsync().ConfigureAwait(false); // 修正为标准JSON格式:包裹数组、给属性名加双引号 string fixedJson = $"[{rawContent.Replace("{", "{\"").Replace(":", "\":\"").Replace(", ", "\",\"")}]"; // 手动序列化(示例用Newtonsoft.Json,也可替换为System.Text.Json) dataObjects = Newtonsoft.Json.JsonConvert.DeserializeObject<List<DataItem>>(fixedJson); } } } catch (Exception ex) { // 异常处理 }
内容的提问来源于stack exchange,提问作者Pooja
相关产品推荐
相关产品推荐

