在Minimal API中使用Results.OK时,当JsonSerializerOptions.PropertyNamingPolicy没有效果时,如何设置JSON PropertyNamingPolicy?

问题描述 投票:0回答:2

我正在使用最小 API 来重新创建旧的 REST 服务,因此我需要尽可能模仿以前服务的功能。旧服务中的信息返回帕斯卡大小写,我知道有一些旧客户端区分大小写。开箱即用的 .NET 6 在网络上序列化为驼峰式大小写,但可以使用以下代码覆盖:

builder.Services.Configure<JsonOptions>(options =>
{
    options.JsonSerializerOptions.PropertyNamingPolicy = null;
});

如果设置了断点,我可以看到策略最初设置为驼峰式大小写,然后重置为空。如果我然后使用

JsonSerializer.Serialize
它会按预期工作。唯一的问题是,如果我使用
Results.OK(colection)
它会回到驼峰式大小写,就好像它忽略了选项设置一样。我可以在模型类上使用声明性属性设置所有属性名称,并且按预期工作,因此内联声明可以工作,但在服务级别上的设置却不能。那么,“Results.OK”响应管道正在考虑哪些选项?

编辑:更正的方法名称

c# .net-6.0 system.text.json jsonserializer minimal-apis
2个回答
7
投票

Asp.Net core 中实际上有两个不同的

JsonOptions

  1. Microsoft.AspNetCore.Http.Json.JsonOptions
  2. Microsoft.AspNetCore.Mvc.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
),但所有选项应该相同。


0
投票

我需要将其更改为默认的替代方案,所以最后我这样做了:

首先创建一个

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
        });
    }
© www.soinside.com 2019 - 2024. All rights reserved.