Существует ли встроенный способ использования кейса в качестве политики именования для JSON в ASP.NET Core 3? - PullRequest
0 голосов
/ 26 октября 2019

Мне удалось заставить его работать, используя следующий код:

.AddNewtonsoftJson(options => {
    options.SerializerSettings.ContractResolver = new DefaultContractResolver
    {
        NamingStrategy = new SnakeCaseNamingStrategy()
    };
});

Однако это заставляет MVC использовать Newtonsoft вместо System.Text.JSON, который быстрее, асинхронный и встроенный.

Глядя на параметры политики именования в System.Text.JSON Я мог найти только CamelCase. Есть ли нативная поддержка для случая змеи? Как лучше всего реализовать стиль именования JSON в случае со змеей?

Ответы [ 2 ]

0 голосов
/ 27 октября 2019

Небольшое изменение в pfx коде для удаления зависимости от расширения Newtonsoft Json.Net.

String для преобразования данной строки в SnakeCase.

* 1009. *

Тогда в нашем SnakeCaseNamingPolicy мы можем сделать

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();
    }
}

Последний шаг - зарегистрировать нашу политику именования в Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers()            
        .AddJsonOptions(
            options => { 
                options.JsonSerializerOptions.PropertyNamingPolicy = 
                    SnakeCaseNamingPolicy.Instance;
            });
}

Используя модель:

public class WeatherForecast
{
    public DateTime Date { get; set; }

    public int TemperatureCelcius { get; set; }

    public int TemperatureFahrenheit { get; set; }

    public string Summary { get; set; }
}

Json выход:

{
  "date": "2019-10-28T08:26:14.878444+05:00",
  "temperature_celcius": 4,
  "temperature_fahrenheit": 0,
  "summary": "Scorching"
}
0 голосов
/ 27 октября 2019

В настоящее время нет встроенной поддержки для случая со змеей,
, но .NET Core 3.0 позволяет настроить настраиваемую политику именования путем наследования от JsonNamingPolicy.

Вам необходимо реализовать метод ConvertName с преобразованием случая змеи.
(В Newtonsoft Json.NET есть внутренний класс StringUtils, который показывает, как с этим справиться. )


В приведенной ниже реализации POC повторно используется Json.NET SnakeCaseNamingStrategy только для преобразования регистра змеи (тогда как все приложение использует System.Text.Json) .

Лучше избегать зависимости от Newtonsoft Json.Net только для преобразования случая змеи, но в этом довольно ленивом примере ниже я не хочу переосмысливать / заново изобретать преобразование случая змеиМетод.
Суть этого ответа заключается в том, как подключить пользовательскую политику (а не саму конвертацию случая змеи).
(Есть много библиотек и примеров кода , которые показываюткак это сделать.)

public class SnakeCaseNamingPolicy : JsonNamingPolicy
{
    private readonly SnakeCaseNamingStrategy _newtonsoftSnakeCaseNamingStrategy
        = new SnakeCaseNamingStrategy();

    public static SnakeCaseNamingPolicy Instance { get; } = new SnakeCaseNamingPolicy();

    public override string ConvertName(string name)
    { 
        /* A conversion to snake case implementation goes here. */

        return _newtonsoftSnakeCaseNamingStrategy.GetPropertyName(name, false);
    }
}

В Startup.cs летВы примените этот пользовательский SnakeCaseNamingPolicy.

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers()            
        .AddJsonOptions(
            options => { 
                options.JsonSerializerOptions.PropertyNamingPolicy = 
                    SnakeCaseNamingPolicy.Instance;
            });
}

Экземпляр класса ниже

public class WeatherForecast
{
    public DateTime Date { get; set; }

    public int TemperatureCelcius { get; set; }

    public int TemperatureFahrenheit { get; set; }

    [JsonPropertyName("Description")]
    public string Summary { get; set; }
}

будет иметь представление Json как:

{ "date" : "2019-10-28T01:00:56.6498885+01:00",
  "temperature_celcius" : 48,
  "temperature_fahrenheit" : 118,
  "Description" : "Cool"
}

Обратите внимание, что свойству Summary присвоено имя Description,
, которое соответствует System.Text.Json.Serialization.JsonPropertyNameAttribute.

...