ASP.NET MVC调用Web API出现JSON数组无法反序列化为model错误如何解决
报错核心原因
你遇到的Cannot deserialize the current JSON array into type model because the type requires a JSON object to deserialize correctly报错,本质是返回的JSON结构和反序列化目标类型不匹配:
- Web API接口返回的DataTable序列化后是JSON数组结构,哪怕仅返回1行数据,也会被包裹在
[]中,结构示例:[{"ID":"xxx","DateSale":"xxx","From":"xxx","To":"xxx"}] - MVC调用端指定的反序列化目标是单个
V_WebSearch对象,期望接收不带[]的纯JSON对象结构,自然触发类型匹配失败。
你单独调用Web API能正常获取数据,是因为直接查看原始返回内容没有做强类型校验,到MVC端执行强类型反序列化时才会暴露问题,报错出现在readTask.Wait()行是因为这一步才会实际执行反序列化动作。
解决方案
根据你的业务场景二选一即可:
场景1:存储过程最多返回1条匹配数据
修改Web API的返回逻辑,将DataTable转换为单个v_websearch对象后再返回,避免返回数组结构,示例代码:
public IHttpActionResult GetById (string id) { ConnectionString(); con.Open(); SqlCommand com = new SqlCommand("oid_validation", con); com.CommandType = CommandType.StoredProcedure; com.Parameters.Add(new SqlParameter("@oid", id)); SqlDataReader dr = com.ExecuteReader(); DataTable dt = new DataTable(); dt.Load(dr); if(dt.Rows.Count == 0) return NotFound(); // 手动转换为单条模型对象 v_websearch result = new v_websearch() { ID = (System.Guid)dt.Rows[0]["ID"], DateSale = (System.DateTime)dt.Rows[0]["DateSale"], From = (System.DateTime)dt.Rows[0]["From"], To = (System.DateTime)dt.Rows[0]["To"] }; return Ok(result); }
修改后MVC端原有代码无需调整即可正常反序列化。
场景2:存储过程可能返回多条匹配数据
保持Web API逻辑不变,修改MVC调用端的反序列化目标为集合类型,示例调整代码:
if (result.IsSuccessStatusCode) { // 反序列化目标改为集合类型 var readTask = result.Content.ReadAsAsync<List<V_WebSearch>>(); readTask.Wait(); // 按需取第一条或直接返回集合给视图 dt = readTask.Result.FirstOrDefault(); return View(dt); }
额外注意事项
- 你定义的模型类中命名空间
system首字母需要大写为System,否则会触发编译错误。 - 异步方法中尽量不要用
Wait()/.Result这类阻塞调用,直接用await关键字更稳妥,可以避免线程死锁问题,示例调整:
// 原写法var result = responseTask.Result; var result = await responseTask; // 原写法readTask.Wait(); dt = readTask.Result; dt = await result.Content.ReadAsAsync<V_WebSearch>();
内容的提问来源于stack exchange,提问作者user14979715
相关产品推荐
相关产品推荐

