ASP.NET Core MVC反序列化多对象JSON数组报错解决方法
解决方案
报错核心原因是反序列化目标类型与接口返回的JSON结构不匹配:单对象接口返回JSON对象,可直接反序列化为ToDoStructure;全量列表接口返回JSON对象数组,必须反序列化为集合类型才能正常处理,具体修改如下:
1. 修改控制器代码
将反序列化目标类型从单个ToDoStructure改为List<ToDoStructure>集合,同时替换请求地址为全量todos接口,修改后代码如下:
using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using ToDo.Models; using System.Net; using System.Collections.Generic; namespace ToDo.Controllers { public class ToDoData : Controller { public ActionResult ToDoModel() { var webClient = new WebClient(); webClient.Headers.Add(HttpRequestHeader.Cookie, "cookievalue"); var json = webClient.DownloadString(@"https://jsonplaceholder.typicode.com/todos"); List<ToDoStructure> ToDoList = JsonConvert.DeserializeObject<List<ToDoStructure>>(json); return View(ToDoList); } } }
需手动引入
System.Collections.Generic命名空间,否则无法识别List类型。
2. 修改Razor视图代码
首先将视图的模型声明改为集合类型,再通过循环遍历集合逐行渲染待办数据,同时修正原代码中数据单元格误用<th>标签的问题(数据单元格应使用<td>标签),修改后代码如下:
@model List<ToDo.Models.ToDoStructure> @{ ViewBag.Title = "ToDoModel"; Layout = "~/Views/Shared/_Layout.cshtml"; } <h2>ToDoModel</h2> <table> <tr> <th>userId</th> <th>id</th> <th>title</th> <th>completed</th> </tr> @foreach (var item in Model) { <tr> <td>@item.userId</td> <td>@item.id</td> <td>@item.title</td> <td>@item.completed</td> </tr> } </table>
修改完成后重启项目,即可正常解析全量接口返回的JSON数组,所有待办数据会以表格形式逐行展示,不会再出现类型不匹配的反序列化报错。
内容的提问来源于stack exchange,提问作者Kerkus
相关产品推荐
相关产品推荐

