JN
03/25/2026, 12:16 AMMike Chambers
03/25/2026, 9:37 AMreturn new JsonResult(obj, new JsonSerializerOptions()); Default is Pascal case..
if you wanted other casing.. it would be
return new JsonResult(obj,new JsonSerializerOptions{PropertyNamingPolicy = JsonNamingPolicy.KebabCaseLower });
ps using System.Text.Json;JN
03/25/2026, 11:56 AMMike Chambers
03/25/2026, 2:49 PMcsharp
// PascalCaseJsonOutputFormatter.cs
public class PascalCaseJsonOutputFormatter : JsonOutputFormatter
{
private readonly string _targetNamespace;
public PascalCaseJsonOutputFormatter(ILogger logger, JsonSerializerOptions options, string targetNamespace)
: base(options, logger)
{
_targetNamespace = targetNamespace;
}
public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
{
var controller = context.HttpContext.GetEndpoint()?.Metadata.GetMetadata<ControllerActionDescriptor>()?.ControllerTypeInfo;
if (controller?.Namespace?.StartsWith(_targetNamespace) != true)
{
// Fallback to default formatter logic or throw/skip
await base.WriteResponseBodyAsync(context, selectedEncoding);
return;
}
// Use PascalCase (null policy)
Options.JsonSerializerOptions.PropertyNamingPolicy = null;
await base.WriteResponseBodyAsync(context, selectedEncoding);
}
}
IComposer or program.cs
csharp
builder.Services.AddControllers(options =>
{
var pascalFormatter = new PascalCaseJsonOutputFormatter(
loggerFactory.CreateLogger<PascalCaseJsonOutputFormatter>(),
new JsonSerializerOptions(),
"YourApp.Controllers" // Your namespace
);
options.OutputFormatters.Insert(0, pascalFormatter);
});JN
03/25/2026, 5:34 PM