У меня есть следующая конфигурация политики JSON в моем Startup.cs
:
services.AddControllers().ConfigureApiBehaviorOptions(options =>
{
options.SuppressInferBindingSourcesForParameters = true;
options.SuppressModelStateInvalidFilter = true;
// options.SuppressMapClientErrors = true;
})
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.PropertyNamingPolicy =
SnakeCaseNamingPolicy.Instance;
});
И политика:
public class SnakeCaseNamingPolicy : JsonNamingPolicy
{
public static SnakeCaseNamingPolicy Instance { get; } = new SnakeCaseNamingPolicy();
public override string ConvertName(string name)
{
// Conversion to other naming conventaion goes here. Like SnakeCase, KebabCase etc.
return name.ToSnakeCase();
}
}
И ToSnakeCase
:
public static class StringUtils
{
public static string ToSnakeCase(this string str)
{
return string.Concat(str.Select((x, i) => i > 0 && char.IsUpper(x) ? "_" + x.ToString()
: x.ToString())).ToLower();
}
}
Я использую его, чтобы иметь возможность получить JSON в snake_case
.
Вот моя модель:
public class CategoryViewModelCreate
{
[Required(ErrorMessage = "Inner id is required")]
[JsonPropertyName("inner_id")]
public int? InnerId { get; set; }
[Required(ErrorMessage = "Name is required")]
[JsonPropertyName("name")]
public string Name { get; set; }
}
Мой контроллер:
public async Task<IActionResult> Create([FromBody] CategoryViewModelCreate viewModel)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
И теперь он работает нормально, если у меня есть следующее JSON:
{
"name": "testing",
"inner_id": 123
}
Но если мой JSON (без имени):
{
"inner_id": 123
}
У меня есть следующее сообщение проверки:
{
"Name": [
"Name is required"
]
}
Но это неправильно. Я хотел бы иметь (name
вместо Name
и snake_case
для других клавиш):
{
"name": [
"Name is required"
]
}
Как его настроить? Куда? Как видите, я пытаюсь использовать [JsonPropertyName("name")]
, но безуспешно (
Я ценю любую помощь.