.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
相关产品推荐
相关产品推荐

