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
相关产品推荐
相关产品推荐

