为了自动修剪所有输入字符串并删除新行,我开发了一个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()
可以访问对象的类型。仅将修剪应用于您关心的类型。