Newtonsoft JSON DefaultSettings для сборки - PullRequest
1 голос
/ 30 марта 2019

Чтобы автоматически обрезать все входные строки и удалять новые строки, я разработал реализацию JsonConverter<string> и зарегистрировал ее в Startup с помощью

JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
    Converters = new List<JsonConverter>
    {
        new StringTrimmer()
    }
};

Это работает, но триммер строки отрицательновлияние на сторонние сборки.Есть ли способ, которым я могу настроить параметры по умолчанию для сборки моего приложения или зарегистрировать экземпляр с JsonConvert.Create(mySettings)?Или есть другой метод, который я мог бы автоматически обрезать весь ввод без JsonConvert?

Ответы [ 3 ]

2 голосов
/ 30 марта 2019

Вы можете программно применить конвертер только в определенных сборках, используя пользовательский ContractResolver, например:

public class CustomResolver : DefaultContractResolver
{
    private Assembly[] TargetAssemblies { get; set; }

    public CustomResolver(params Assembly[] targetAssemblies)
    {
        TargetAssemblies = targetAssemblies;
    }

    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization ms)
    {
        JsonProperty prop = base.CreateProperty(member, ms);

        if (prop.PropertyType == typeof(string) &&
            TargetAssemblies.Contains(prop.DeclaringType.Assembly))
        {
            prop.Converter = new StringTrimmer();
        }

        return prop;
    }
}

Затем используйте его в настройках по умолчанию, например, где Foo заменяется одним из известных классов в сборке вашего приложения:

JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
    ContractResolver = new CustomResolver(typeof(Foo).Assembly)
};

Вы можете добавить более одной сборки, если вам нужно, например ::

JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
    ContractResolver = new CustomResolver(typeof(Foo).Assembly, typeof(Bar).Assembly)
};
2 голосов
/ 30 марта 2019

Если вас интересует только то, как ASP.NET Core сериализует JSON, вы можете явно настроить JsonSerializerSettings для инфраструктуры MVC, используя AddJsonOptions:

services.AddMvc()
    .AddJsonOptions(options =>
    {
        options.SerializerSettings.Converters.Add(new StringTrimmer());
    });
0 голосов
/ 31 марта 2019

Сообщите вашему StringTrimmer о типах (и их сборках), с которыми он имеет дело. WriteJson() и ReadJson() имеют доступ к типу объекта. Применяйте обрезку только к тем типам, которые вас интересуют.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...