Как я могу установить JSON правила сериализации для проверочных сообщений? - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть следующая конфигурация политики 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")], но безуспешно (

Я ценю любую помощь.

1 Ответ

1 голос
/ 19 февраля 2020

Вы можете создать свой базовый унаследованный контроллер и метод ovveride BadRequest(ModelStateDictionary m)

BadRequest(ModelStateDictionary model)
{
    var newModel = model.ToDictionary(
            x => x.Key.ToCamelCase(),  
            x => kvp.Value
        );
    base.BadRequest(newModel);
}

Как-то так

...