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

C#反序列化数组包裹的接口JSON返回值出现JsonReaderException如何解决

问题根因

你遇到的报错:

JsonReaderException: Unexpected character encountered while parsing value: <. Path '', line 0, position 0.

这个错误直接说明代码请求接口拿到的返回内容不是JSON格式,而是以<开头的HTML文本,大概率是接口返回了错误页面(比如404、500报错页、权限校验不通过的跳转页),和你反序列化用数组还是单个对象无关,首先要先解决请求返回值异常的问题。

另外就算接口返回了正确JSON,你当前的SomeModel类也无法正确映射JSON字段,因为JSON字段是蛇形命名,C#类属性是帕斯卡命名,默认没有对应映射关系。

解决步骤

1. 排查接口请求异常

  • 先在代码中string apiResponse = await response.Content.ReadAsStringAsync();行打断点,查看apiResponse的实际内容,确认返回的是否为你预期的JSON结构
  • 检查请求的URL是否正确:确认拼接的id参数是否为空、是否符合接口要求
  • 补充必要的请求信息:Postman能正常请求不代表代码请求逻辑一致,你需要补充Postman里带的认证信息(Cookie、Token等)、请求头,比如可以先添加JSON响应要求:
using (var httpClient = new HttpClient())
{
    // 明确要求接口返回JSON格式
    httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
    // 如果接口需要认证,在这里加认证头,示例:
    // httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "你的接口token");
    using (var response = await httpClient.GetAsync("https://someurl.dev.local/getInfo/" + id))
    {
        if (response.StatusCode == System.Net.HttpStatusCode.OK)
        {
            string apiResponse = await response.Content.ReadAsStringAsync();
            // 确认apiResponse是正确的JSON后再执行反序列化
            variable = JsonConvert.DeserializeObject<SomeModel[]>(apiResponse);                              
        }
        else
            ViewBag.StatusCode = response.StatusCode;
    }
}

2. 修正SomeModel字段映射

给C#类属性添加JsonProperty特性,和JSON字段名一一对应:

namespace ThisSolution.Models
{
    public partial class SomeModel
    {
        [JsonProperty("dl_load_date")]
        public DateTime? DlLoadDate { get; set; }
        [JsonProperty("this_nbr")]
        public int? ThisNbr{ get; set; }
        [JsonProperty("that_nbr")]
        public int? ThatNbr { get; set; }
        // Passtest字段名和JSON一致,不需要加映射
        public string Passtest { get; set; }
        [JsonProperty("pri_key")]
        public string PriKey { get; set; }
    }
}

3. 反序列化操作

你用数组接收外层带方括号的JSON数组的写法是正确的,也可以换成List<SomeModel>接收,两种方式都兼容:

// 数组写法,和你原有逻辑一致
SomeModel[] variable = JsonConvert.DeserializeObject<SomeModel[]>(apiResponse);

// List写法,操作更灵活
List<SomeModel> variable = JsonConvert.DeserializeObject<List<SomeModel>>(apiResponse);

// 取单个对象的逻辑示例
if(variable != null && variable.Length > 0) // 如果是List就用variable.Count > 0
{
    SomeModel result = variable[0];
    // 后续操作result即可
}

内容的提问来源于stack exchange,提问作者LeoDev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:06:03