【问题标题】:Newtonsoft JSON DefaultSettings per Assembly每个程序集的 Newtonsoft JSON 默认设置
【发布时间】:2019-03-30 13:19:34
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    services.AddMvc()
        .AddJsonOptions(options =>
        {
            options.SerializerSettings.Converters.Add(new StringTrimmer());
        });
    

    【讨论】:

      【解决方案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)
      };
      

      【讨论】:

        【解决方案3】:

        让您的StringTrimmer 了解它正在处理的类型(及其程序集)。 WriteJson() 和 ReadJson() 具有 access 到对象的类型。仅将修剪应用于您关心的类型。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-11-22
          • 2013-01-13
          • 1970-01-01
          • 2011-11-18
          • 1970-01-01
          相关资源
          最近更新 更多