Newtonsoft JSON DefaultSettings per Assembly



为了自动修剪所有输入字符串并删除新行,我开发了一个JsonConverter<string>的实现,并在Startup注册了

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

这有效,但字符串修剪器会对第三方程序集产生负面影响。 有没有办法将默认设置的范围限定为应用程序的程序集,或者向JsonConvert.Create(mySettings)注册实例? 或者有没有另一种方法可以在没有 JsonConvert 的情况下自动修剪所有输入?

如果您只关心更改 ASP.NET Core 序列化 JSON 的方式,那么您可以使用 AddJsonOptions 显式配置 MVC 框架的JsonSerializerSettings

services.AddMvc()
    .AddJsonOptions(options =>
    {
        options.SerializerSettings.Converters.Add(new StringTrimmer());
    });
可以使用如下所示

的自定义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)
};

让你的StringTrimmer知道它正在处理的类型(及其程序集(。 WriteJson()ReadJson()可以访问对象的类型。仅将修剪应用于您关心的类型。

相关内容

  • 没有找到相关文章

最新更新