ASP.NET Core MVC使用C#从URL解析JSON数据报CS1061错误
问题根因
编译错误CS1061以及后续项目运行会遇到的问题,本质是几个写法错误和框架约定不熟悉导致的:
- 你在控制器中定义的
Converter是object类型,本身不存在DeserializeObject方法,自然触发找不到方法的编译错误。Json.NET的反序列化能力由静态类JsonConvert提供,不需要自行实例化序列化对象。 - 控制器放错了目录和命名空间:ASP.NET Core MVC默认约定控制器存放在
Controllers目录下,对应命名空间带.Controllers后缀,你把控制器塞到Models.JsonModel命名空间下,后续路由识别、视图匹配都会出问题。 - 命名冲突:控制器类名取为
objJson,方法内反序列化返回的对象变量也命名为objJson,就算解决序列化问题,这里也会触发命名冲突编译错误。 - 用了过时的
WebClient发HTTP请求:ASP.NET Core官方推荐使用IHttpClientFactory创建HTTP客户端,WebClient不会自动释放连接资源,高并发场景下容易耗尽连接池。 - 视图命名和路径不匹配:Action方法叫
GetJsonDataModel,视图却命名为index.cshtml,运行时会找不到对应视图。
分步修复方案
1. 确认依赖安装
如果项目还没安装Json.NET,在NuGet包管理器中搜索安装Newtonsoft.Json稳定版即可,你代码中已经引入了该命名空间,大概率已经完成安装,可跳过此步。
2. 修正控制器代码
将控制器文件移动到项目根目录的Controllers文件夹下,修正命名空间、错误的序列化调用、命名冲突、过时的HTTP请求写法,修正后代码如下:
using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using System.Net.Http; using System.Threading.Tasks; namespace ProjectDemoJsonURL.Controllers { public class JsonDemoController : Controller { private readonly HttpClient _httpClient; // 注入HttpClient实例发网络请求,适配ASP.NET Core的资源管理规则 public JsonDemoController(IHttpClientFactory httpClientFactory) { _httpClient = httpClientFactory.CreateClient(); } // 网络请求是IO操作,用异步写法避免阻塞工作线程 public async Task<ActionResult> GetJsonDataModel() { // 拉取目标地址的JSON字符串 var jsonStr = await _httpClient.GetStringAsync("https://jsonplaceholder.typicode.com/todos/1"); // 直接调用JsonConvert的静态方法完成反序列化,不需要自定义Converter对象 var todoData = JsonConvert.DeserializeObject<Models.JsonModel.RootObject>(jsonStr); return View(todoData); } } }
注意:原来控制器里写的
public object Converter { get; private set; }完全是冗余代码,直接删掉即可,JsonConvert是静态类,不需要实例化就能调用方法。
3. 添加服务配置
如果用的是.NET 6+的最小API模板,打开项目根目录的Program.cs,在服务注册部分加一行HttpClient的注册,放在MVC服务注册之前即可:
var builder = WebApplication.CreateBuilder(args); // 新增这行,注册IHttpClientFactory builder.Services.AddHttpClient(); // 原有服务注册保留,比如AddControllersWithViews等 builder.Services.AddControllersWithViews();
4. 修正视图路径与代码
- 将原来的
index.cshtml重命名为GetJsonDataModel.cshtml,移动到Views/JsonDemo目录下(目录名和控制器名JsonDemoController匹配,符合MVC路由约定) - 修正视图里的标签错误(表体数据用
<td>而非<th>,去掉多余的大括号),修正后视图代码:
@model ProjectDemoJsonURL.Models.JsonModel.RootObject @{ ViewBag.Title = "GetJsonDataModel"; Layout = "~/Views/Shared/_Layout.cshtml"; } <h2>GetJsonDataModel</h2> <table> <tr> <th>userId</th> <th>id</th> <th>title</th> <th>completed</th> </tr> <tr> <td>@Model.userId</td> <td>@Model.id</td> <td>@Model.title</td> <td>@Model.completed</td> </tr> </table>
5. 运行验证
启动项目后访问路径/JsonDemo/GetJsonDataModel,就能看到从接口拉取的JSON数据被解析后正常展示在表格中。
补充说明
- 不想额外装Newtonsoft.Json的话,也可以用ASP.NET Core内置的
System.Text.Json做序列化,反序列化调用方式为JsonSerializer.Deserialize<Models.JsonModel.RootObject>(jsonStr),不需要引入第三方依赖。 - 日常写MVC项目尽量遵守框架默认约定:Models文件夹放数据模型、Controllers放控制器、Views按控制器名分子目录存放对应视图,不需要额外写配置就能自动匹配路由和视图,能省掉很多无意义的报错。
内容的提问来源于stack exchange,提问作者Kerkus
相关产品推荐
相关产品推荐

