AspNet Core MVC中如何获取JSON默认内容类型?
获取ASP.NET Core MVC中默认JSON内容类型的方法
当然可以!完全不用硬编码这个值,ASP.NET Core早就为我们准备好了内置的方式来获取默认的JSON内容类型,下面给你两种常用的实现场景:
在控制器中直接获取
你可以通过注入 IOptions<MvcOptions> 来访问框架的配置,因为默认的JSON输出格式就是在 MvcOptions 的格式化器配置里定义的。
示例代码:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Formatters; using Microsoft.Extensions.Options; public class HomeController : Controller { private readonly MvcOptions _mvcOptions; // 通过构造函数注入MvcOptions配置 public HomeController(IOptions<MvcOptions> mvcOptions) { _mvcOptions = mvcOptions.Value; } public IActionResult GetDefaultJsonContentType() { // 找到系统默认的System.Text.Json输出格式化器 var jsonFormatter = _mvcOptions.OutputFormatters.OfType<SystemTextJsonOutputFormatter>().FirstOrDefault(); if (jsonFormatter != null) { // 获取第一个(默认的)支持的媒体类型 var defaultContentType = jsonFormatter.SupportedMediaTypes.First().ToString(); // 这里得到的就是你要的 "application/json; charset=utf-8" return Ok(defaultContentType); } return NotFound("未找到JSON输出格式化器"); } }
注意:如果你的项目使用的是Newtonsoft.Json(而非默认的System.Text.Json),只需要把 SystemTextJsonOutputFormatter 替换成 NewtonsoftJsonOutputFormatter 即可。
在服务类中获取
和控制器的思路一致,同样通过依赖注入获取 IOptions<MvcOptions> 来拿到配置值,适合在业务服务中复用这个逻辑:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Formatters; using Microsoft.Extensions.Options; public class JsonContentTypeHelper { private readonly string _defaultJsonContentType; public JsonContentTypeHelper(IOptions<MvcOptions> mvcOptions) { var jsonFormatter = mvcOptions.Value.OutputFormatters.OfType<SystemTextJsonOutputFormatter>().FirstOrDefault(); // 兜底设置默认值,防止格式化器找不到的极端情况 _defaultJsonContentType = jsonFormatter?.SupportedMediaTypes.First().ToString() ?? "application/json; charset=utf-8"; } public string GetDefaultJsonContentType() { return _defaultJsonContentType; } }
如果需要在项目中使用这个服务,记得在 Program.cs 里注册它:
builder.Services.AddScoped<JsonContentTypeHelper>();
额外提醒
- 这种方式的好处是可维护性高:如果后续你在
Program.cs中修改了JSON的默认内容类型(比如调整字符编码),通过这种方式获取的值会自动同步更新,不需要修改业务代码。 - 如果项目配置了多个JSON格式化器,记得根据实际需求筛选对应的那个(比如区分System.Text.Json和Newtonsoft.Json的实现)。
内容的提问来源于stack exchange,提问作者stephan.peters
相关产品推荐
相关产品推荐

