如何将 WebApi 设置为默认为 UpperCamelCase (Json)

How to set WebApi to default to UpperCamelCase (Json)

我想配置 WebApi 的默认序列化程序,以便它应该保留 class 中的字段名称。

namespace ChimuLambdaApi.Controllers;

[ApiController]
[Microsoft.AspNetCore.Mvc.Route("[controller]")]
public class V1Controller : ControllerBase {
    private readonly ILogger<V1Controller> _logger;

    public V1Controller(ILogger<V1Controller> logger) => _logger = logger;

    [Microsoft.AspNetCore.Mvc.HttpGet("map")]
    public Beatmap GetBeatmap(long id) {
        return new Beatmap() { };
    }
}


namespace ChimuLambdaApi;

public class Beatmap {
    public int BeatmapId { get; set; }
    public double BPM { get; set; }
    public float AR { get; set; }
    public float OD { get; set; }
    public float CS { get; set; }
    public float HP { get; set; }
    public string File { get; set; }
}

这是我从 WebApi 得到的结果。

   "beatmapId": 0,
   "bpm": 0,
   "ar": 0,
   "od": 0,
   "cs": 0,
   "hp": 0,
   "file": "string"

这就是我想要得到的。

   "BeatmapId": 0,
   "BPM": 0,
   "AR": 0,
   "OD": 0,
   "CS": 0,
   "HP": 0,
   "File": "string"

你可以这样使用。也许代码可以写得更有效。

[Microsoft.AspNetCore.Mvc.HttpGet("map")]
public string GetBeatmap(long id) {
   return JsonConvert.SerializeObject(new BeatMap(), Formatting.Indented, new JsonSerializerSettings
      {
         ContractResolver = new CamelCasePropertyNamesContractResolver()
      });
}

您可以在 Program.cs 中配置 JsonOptions。使用 PropertyNameCaseInsensitivePropertyNamingPolicy 的以下配置,您可以实现所需的功能:

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

这将配置序列化程序以匹配您的 class 属性的大小写。如果你想要不同的外壳,你可以在属性上使用 [JsonPropertyName] 属性。

您可以在 AddControllers 之后使用 builder.Services.AddControllers().AddJsonOptions(...) 配置相同的属性。


但是,clients/serializers 的大多数都配置为在 sending/receiving 请求时默认使用驼峰式命名,因此您可以为自己(或其他使用您的 API 的人)引入更多工作未来。