如何在ASP.NET Core MVC中为HttpResult指定JsonSerializerOptions?
为HttpResult指定序列化选项的解决方案
在ASP.NET Core里,IResult(包括HttpResult、TypedResults这类返回类型)和MVC控制器的IActionResult用的不是同一套序列化配置,所以你之前在AddJsonOptions里设的规则不会生效。下面是两种解决办法:
方法一:全局统一配置
直接给最小API体系的序列化选项做全局配置,和MVC的保持一致就行。修改Program.cs:
var builder = WebApplication.CreateBuilder(args); // MVC控制器的序列化配置 builder.Services.AddControllers().AddJsonOptions( o => o.JsonSerializerOptions.PropertyNamingPolicy = System.Text.Json.JsonNamingPolicy.SnakeCaseUpper ); // 给IResult/TypedResults配置相同的序列化规则 builder.Services.Configure<Microsoft.AspNetCore.Http.Json.JsonOptions>( o => o.SerializerOptions.PropertyNamingPolicy = System.Text.Json.JsonNamingPolicy.SnakeCaseUpper ); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); app.UseSwagger(); app.UseSwaggerUI(); app.MapControllers(); app.Run();
这样所有返回IResult或TypedResults的接口,都会自动套用蛇形大写的命名策略。
方法二:单个接口单独配置
如果不想全局改,只想给特定接口指定序列化规则,可以在返回结果时手动传入自定义配置:
修改FoosController的代码:
using Microsoft.AspNetCore.Http.HttpResults; using Microsoft.AspNetCore.Mvc; using System.Text.Json; namespace WebApplication.Controllers; [Route("foos")] public class FoosController { // 定义自定义序列化选项 private static readonly JsonSerializerOptions _customJsonOpts = new() { PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseUpper }; [HttpGet("raw")] public Foo Raw() => new Foo(); [HttpGet("action-result")] public IActionResult Action() => new OkObjectResult(new Foo()); [HttpGet("http-result")] public IResult Http() => Results.Json(new Foo(), options: _customJsonOpts); [HttpGet("typed-result")] public IResult Typed() => TypedResults.Json(new Foo(), options: _customJsonOpts); } public class Foo { public int Id { get; set; } public string Label { get; set; } = ""; }
这里注意,TypedResults.Ok没有直接支持传入序列化选项的重载,所以改用TypedResults.Json来返回,效果和Ok完全一致,但能指定自定义配置。
问题根源
本质是两套独立的序列化体系:MVC控制器的AddJsonOptions只覆盖直接返回模型、IActionResult这类场景;而IResult/HttpResult属于最小API的返回机制,默认使用另一套独立的序列化配置,因此需要单独设置才能和MVC的行为对齐。
内容的提问来源于stack exchange,提问作者vernou
相关产品推荐
相关产品推荐

