每个程序集的Newtonsoft JSON DefaultSettings

时间:2019-03-30 13:19:35

标签: asp.net-web-api asp.net-core json.net

为了自动修剪所有输入字符串并删除新行,我开发了JsonConverter<string>的实现,并使用

Startup中注册了它。
JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
    Converters = new List<JsonConverter>
    {
        new StringTrimmer()
    }
};

这可行,但是字符串修剪器会对第三方程序集产生负面影响。有什么方法可以将默认设置的作用域扩展到应用程序的程序集,或向JsonConvert.Create(mySettings)注册实例?还是有另一种方法可以自动修剪所有输入而无需JsonConvert?

3 个答案:

答案 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。仅将修剪应用于您关心的类型。