Как использовать JSON.Net CamelCasePropertyNamesContractResolver с именами, разделенными точками? - PullRequest
0 голосов
/ 22 января 2019

Наше приложение использует атрибуты проверки для использования проверки модели ASP.NET, однако это дает имена, разделенные точками, для ошибок проверки.При прохождении через CamelCasePropertyNamesContractResolver применяется только верблюд перед первой точкой, в то время как мы хотели бы, чтобы верблюд применялся к каждому разделу имени.

Например, в настоящее время мы получаем текущий ответ json:

{
    "body.State": [
        "The state field is required."
    ],
    "body.LatestVersion": [
        "The latestVersion field is required."
    ]
}

Но желание выйти:

{
    "body.state": [
        "The state field is required."
    ],
    "body.latestVersion": [
        "The latestVersion field is required."
    ]
}

В нашей настройке MVC есть строка, похожая на

services.AddJsonOptions(options => options.ContractResolver = new CamelCasePropertyNamesContractResolver());

Мы будем признательны за любое решение, будьчто изменения в том, как мы настроили преобразователь, или как мы могли бы изменить проверку.


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

public sealed class RequestModel
{
    [FromRoute, DisplayName("entity"), Required, MaximumLength(255)]
    public string Entity { get; set; }

    [FromBody, DisplayName("body"), Required]
    public BodyModel Body { get; set; }
}

public sealed class BodyModel
{
    [DisplayName("latestVersion"), Required, MaximumLength(255)]
    public string LatestVersion { get; set; }

    [DisplayName("state"), Required]
    public ModelState State { get; set; }
}

, а тело запроса отправляется:

{
}

1 Ответ

0 голосов
/ 27 января 2019

Если предположить, что ошибки валидации сериализуются как некий IDictionary<string, T> для некоторого T, то имена свойств JSON, соответствующие ключам словаря, могут быть по кусочкам верблюжьими между каждым символом . путем создания пользовательского стратегия именования .

Json.NET инкапсулирует логику для алгоритмического переопределения имен свойств и ключей словаря (например, в случае верблюда) в типе NamingStrategy, в частности CamelCaseNamingStrategy.Чтобы изменить логику стратегии именования для применения к каждой части имени свойства между . символами, вы можете принять шаблон декоратора и создать стратегию именования декоратора, которая применяет некоторую внутреннюю стратегию к каждой частиимя примерно так:

public class PiecewiseNamingStrategy : NamingStrategy
{
    readonly NamingStrategy baseStrategy;

    public PiecewiseNamingStrategy(NamingStrategy baseStrategy)
    {
        if (baseStrategy == null)
            throw new ArgumentNullException();
        this.baseStrategy = baseStrategy;
    }

    protected override string ResolvePropertyName(string name)
    {
        return String.Join(".", name.Split('.').Select(n => baseStrategy.GetPropertyName(n, false)));
    }
}

Затем настройте MVC следующим образом:

options.ContractResolver = new DefaultContractResolver
{
    NamingStrategy = new PiecewiseNamingStrategy(new CamelCaseNamingStrategy()) 
    { 
        OverrideSpecifiedNames = true, ProcessDictionaryKeys = true 
    },
};

Это использует тот факт, что, как показано в справочном источнике CamelCasePropertyNamesContractResolver - это просто подкласс DefaultContractResolver, который использует CamelCaseNamingStrategy с ProcessDictionaryKeys = true и OverrideSpecifiedNames = true.

Примечания:

...