如何将 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
。使用 PropertyNameCaseInsensitive
和 PropertyNamingPolicy
的以下配置,您可以实现所需的功能:
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 的人)引入更多工作未来。
我想配置 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
。使用 PropertyNameCaseInsensitive
和 PropertyNamingPolicy
的以下配置,您可以实现所需的功能:
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 的人)引入更多工作未来。