我正在使用最小 API 来重新创建旧的 REST 服务,因此我需要尽可能模仿以前服务的功能。旧服务中的信息返回帕斯卡大小写,我知道有一些旧客户端区分大小写。开箱即用的 .NET 6 在网络上序列化为驼峰式大小写,但可以使用以下代码覆盖:
builder.Services.Configure<JsonOptions>(options =>
{
options.JsonSerializerOptions.PropertyNamingPolicy = null;
});
如果设置了断点,我可以看到策略最初设置为驼峰式大小写,然后重置为空。如果我然后使用
JsonSerializer.Serialize
它会按预期工作。唯一的问题是,如果我使用 Results.OK(colection)
它会回到驼峰式大小写,就好像它忽略了选项设置一样。我可以在模型类上使用声明性属性设置所有属性名称,并且按预期工作,因此内联声明可以工作,但在服务级别上的设置却不能。那么,“Results.OK”响应管道正在考虑哪些选项?
编辑:更正的方法名称
Asp.Net core 中实际上有两个不同的
JsonOptions
:
我认为您正在使用 Mvc 版本 - 切换到上面的第一个版本应该可以解决问题并返回正确的 Json 大小写。
Results
类是Microsoft.AspNetCore.Http
命名空间的成员,这可以解释为什么它使用与Mvc不同的JsonOptions
。
您可以在文件顶部创建别名(或仅引用完整的命名空间):
using JsonOptions = Microsoft.AspNetCore.Http.Json.JsonOptions;
...
builder.Services.Configure<JsonOptions>(options =>
{
options.SerializerOptions.PropertyNamingPolicy = null;
});
请注意,选项属性名称不同(
JsonSerializerOptions
vs SerializerOptions
),但所有选项应该相同。
我需要将其更改为默认的替代方案,所以最后我这样做了:
首先创建一个
CustomJsonResult
类
using System.Net;
using System.Text.Json;
using Microsoft.AspNetCore.Mvc;
namespace XYZ;
public class CustomJsonResult : IResult
{
private readonly object? _value;
private readonly JsonSerializerOptions? _jsonSerializerOptions;
public CustomJsonResult(object? value, JsonSerializerOptions? jsonSerializerOptions)
{
_value = value;
_jsonSerializerOptions = jsonSerializerOptions;
}
public async Task ExecuteAsync(HttpContext httpContext)
{
HttpResponse response = httpContext.Response;
response.StatusCode = (int)HttpStatusCode.OK;
response.ContentType = "application/json";
string json = JsonSerializer.Serialize(_value, _jsonSerializerOptions);
await response.WriteAsync(json);
}
public static IResult Ok(object? value, JsonSerializerOptions? jsonSerializerOptions)
{
return new CustomJsonResult(value, jsonSerializerOptions);
}
public static IResult Ok<TResult>(TResult? value, JsonSerializerOptions? jsonSerializerOptions)
{
return new CustomJsonResult(value, jsonSerializerOptions);
}
}
然后像这样使用它:
internal static async Task<IResult>? Handler(....)
{
...
MyResponse result = new()
{
...
};
return CustomJsonResult.Ok(result, new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
});
}