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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 16:09:21