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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 21:55:22