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

.NET 6项目出现JsonResult.SerializerSettings类型错误,求解决方案

错误原因及解决思路

错误本质

Property 'JsonResult.SerializerSettings' must be an instance of type 'Newtonsoft.Json.JsonSerializerSettings' 这个错误的核心原因是:
.NET 6+的ASP.NET Core默认使用System.Text.Json作为内置JSON序列化器,但你的代码试图让JsonResult使用Newtonsoft.Json的配置,却没有正确切换项目的JSON序列化器实现,导致类型不匹配。

解决步骤

1. 全局切换到Newtonsoft.Json(推荐)

这是最规范的做法,让整个项目统一使用Newtonsoft.Json:

  • 首先安装适配ASP.NET Core的NuGet包:Microsoft.AspNetCore.Mvc.NewtonsoftJson(仅安装Newtonsoft.Json不够,需要这个专门的适配包)
  • 在Program.cs中配置服务,替换默认序列化器:
    var builder = WebApplication.CreateBuilder(args);
    
    // 添加控制器并配置NewtonsoftJson
    builder.Services.AddControllers()
        .AddNewtonsoftJson(options =>
        {
            // 在这里配置你的序列化规则,比如忽略循环引用
            options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
        });
    
    var app = builder.Build();
    
    // 其他中间件配置...
    app.MapControllers();
    app.Run();
    
  • 之后你的接口可以直接返回Json(Items),无需手动序列化,也不需要JsonRequestBehavior.AllowGet(.NET Core中已废弃该参数,默认允许GET请求返回JSON):
    public IActionResult GetItems()
    {
        try
        {
            List<Item> items = new List<Item>();
            // 注意:这里不能调用自身GetItems(),会导致无限递归,替换成实际获取数据的逻辑
            foreach (var item in GetActualItemsFromDataSource())
            {
                items.Add(new Item(item.Id, item.Name));
            }
    
            return Json(items);
        }
        catch (Exception e)
        {
            // 建议返回具体的错误结果,而不是直接抛出异常
            return StatusCode(500, new { Message = e.Message });
        }
    }
    

2. 局部手动返回JSON字符串(不全局切换)

如果不想全局替换序列化器,你可以手动用Newtonsoft.Json序列化后,返回ContentResult,绕开默认的JsonResult:

public IActionResult GetItems()
{
    try
    {
        List<Item> items = new List<Item>();
        foreach (var item in GetActualItemsFromDataSource())
        {
            items.Add(new Item(item.Id, item.Name));
        }

        var jsonSettings = new Newtonsoft.Json.JsonSerializerSettings
        {
            ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
        };
        var jsonData = Newtonsoft.Json.JsonConvert.SerializeObject(items, jsonSettings);
        return Content(jsonData, "application/json");
    }
    catch (Exception e)
    {
        return StatusCode(500, new { Message = e.Message });
    }
}

3. 修复你现有代码的问题

你之前的尝试中,手动序列化后又调用Json(jsonData, ...)会导致双重序列化(把已经是JSON字符串的内容再序列化为JSON),而且Json()方法的第二个参数期望的是System.Text.Json.JsonSerializerOptions,不是Newtonsoft的JsonSerializerSettings,这也是错误持续出现的原因。

额外注意

你的代码中foreach (var item in GetItems())会无限递归调用当前方法,必然导致栈溢出,必须替换为实际从数据源(如数据库、缓存)获取数据的逻辑。

内容的提问来源于stack exchange,提问作者JaRule1986

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 08:07:43