让 Action 返回的 JSON 保持属性原名(PascalCase),不转换为驼峰

新老接口交替,导致的,只能保持了,使用方式,在接口上加上这个特性

/// <summary>
/// 让 Action 返回的 JSON 保持属性原名(PascalCase),不转换为驼峰
/// </summary>
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)]
public class PascalCaseJsonAttribute : ActionFilterAttribute
{
    private readonly bool _keepOriginalName;
    private readonly bool _ignoreNull;
    private readonly string _dateFormat;

    /// <summary>
    /// 
    /// </summary>
    /// <param name="keepOriginalName">是否保持属性原名(true=保持PascalCase,false=使用驼峰)</param>
    /// <param name="ignoreNull">是否忽略null值</param>
    /// <param name="dateFormat">日期格式</param>
    public PascalCaseJsonAttribute(bool keepOriginalName = true, bool ignoreNull = true, string dateFormat = "yyyy-MM-dd HH:mm:ss")
    {
        _keepOriginalName = keepOriginalName;
        _ignoreNull = ignoreNull;
        _dateFormat = dateFormat;
    }

    public override void OnActionExecuted(ActionExecutedContext context)
    {
        // 检查是否有异常或结果为空
        if (context.Exception != null || context.Result == null)
        {
            base.OnActionExecuted(context);
            return;
        }

        // 如果结果是 ObjectResult,修改其序列化设置
        if (context.Result is ObjectResult objectResult)
        {
            // 创建序列化设置
            var settings = new JsonSerializerSettings
            {
                DateFormatString = _dateFormat,
                ContractResolver = _keepOriginalName
                    ? new DefaultContractResolver()  // 保持原名
                    : new CamelCasePropertyNamesContractResolver(),  // 驼峰命名
                NullValueHandling = _ignoreNull ? NullValueHandling.Ignore : NullValueHandling.Include,
                Formatting = Formatting.None  // 生产环境一般不缩进
            };

            // 添加你已有的转换器
            settings.Converters.Add(new LongToStringConverter());
            settings.Converters.Add(new NullableLongToStringConverter());

            // 重新设置结果
            objectResult.Formatters.Add(new NewtonsoftJsonOutputFormatter(
                settings,
                context.HttpContext.RequestServices.GetRequiredService<ArrayPool<char>>(),
                context.HttpContext.RequestServices.GetRequiredService<IOptions<MvcOptions>>().Value
            ));
        }

        base.OnActionExecuted(context);
    }
}

 

posted @ 2026-08-03 10:37  世人皆萌  阅读(1)  评论(0)    收藏  举报