You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C#中使用HttpResponseMessage读取Web API JSON响应及错误解决

问题分析与解决方案

核心问题

  1. 响应格式不规范:你拿到的API返回是多个独立JSON对象用逗号分隔,但未用数组[]包裹,且属性名(如c、d)没有双引号,不符合标准JSON规范,导致默认序列化器无法解析。
  2. 类型不匹配:你用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 19:55:24