为了自动修剪所有输入字符串并删除新行,我开发了JsonConverter<string>
的实现,并使用
Startup
中注册了它。
JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
Converters = new List<JsonConverter>
{
new StringTrimmer()
}
};
这可行,但是字符串修剪器会对第三方程序集产生负面影响。有什么方法可以将默认设置的作用域扩展到应用程序的程序集,或向JsonConvert.Create(mySettings)
注册实例?还是有另一种方法可以自动修剪所有输入而无需JsonConvert?
答案 0 :(得分:2)
如果只关心更改ASP.NET Core序列化JSON的方式,则可以使用AddJsonOptions
明确为MVC框架配置JsonSerializerSettings
:
services.AddMvc()
.AddJsonOptions(options =>
{
options.SerializerSettings.Converters.Add(new StringTrimmer());
});
答案 1 :(得分:2)
通过使用这样的自定义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 :(得分:0)
使您的StringTrimmer
知道要处理的类型(及其程序集)。 WriteJson()
和ReadJson()
的对象类型为access。仅将修剪应用于您关心的类型。