C# MVC返回Newtonsoft的JObject到前端变为空列表该如何解决?
问题根因
你遇到的嵌套空数组返回问题,本质是ASP.NET MVC 默认的 JsonResult 使用内置的 JavaScriptSerializer 做序列化,该序列化器无法识别 Newtonsoft.Json 定义的 JObject 类型。JObject 实现了 IEnumerable 接口,内置序列化器会将它作为普通集合递归遍历序列化,最终就会输出你看到的 [[[]]] 空嵌套数组结构,和 Newtonsoft 版本无关。
可行解决方案
方案1:替换JObject为匿名类/字典(最简便)
不需要修改任何全局配置,直接调整返回对象类型即可,内置序列化器可正常识别这两类结构:
- 固定属性场景用匿名类:
[HttpPost] public async Task<JsonResult> Something(string data) { //some asynchronous stuff return Json(new { x = "text" // 其他固定属性直接在这里添加即可 }); }
- 动态属性场景用字典:
[HttpPost] public async Task<JsonResult> Something(string data) { //some asynchronous stuff var res = new Dictionary<string, object>(); res.Add("x", "text"); // 可按需动态添加任意属性 res.Add("customKey", "customValue"); return Json(res); }
方案2:自定义支持Newtonsoft的JsonResult
如果业务逻辑必须使用JObject处理数据,可自定义适配Newtonsoft的返回结果类,替换默认的JsonResult:
- 先定义自定义结果类:
public class JsonNetResult : JsonResult { public override void ExecuteResult(ControllerContext context) { if (context == null) throw new ArgumentNullException("context"); var response = context.HttpContext.Response; response.ContentType = string.IsNullOrEmpty(ContentType) ? "application/json" : ContentType; if (ContentEncoding != null) response.ContentEncoding = ContentEncoding; if (Data != null) { // 使用Newtonsoft完成序列化 response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(Data)); } } }
- 控制器中返回该自定义结果即可:
[HttpPost] public async Task<ActionResult> Something(string data) { //some asynchronous stuff var jsonObject = new JObject(); jsonObject.Add("x", "text"); return new JsonNetResult() { Data = jsonObject }; }
方案3:全局配置MVC使用Newtonsoft作为默认序列化器
如果项目整体依赖Newtonsoft的序列化能力,可在Global.asax.cs的Application_Start方法中注入配置,替换所有JsonResult的默认序列化逻辑,后续控制器直接返回Json(JObject实例)即可正常输出。
内容的提问来源于stack exchange,提问作者Sergio
相关产品推荐
相关产品推荐

