【问题标题】:How to tell Json.Net globally to apply the StringEnumConverter to all enums如何全局告诉 Json.Net 将 StringEnumConverter 应用于所有枚举
【发布时间】:2011-11-17 16:19:04
【问题描述】:

我想用 json.net 将枚举反序列化为它们的字符串表示形式,反之亦然。我能想出告诉框架应用其StringEnumConverter 的唯一方法是像这样注释有问题的属性:

[JsonConverter(typeof(StringEnumConverter))]
public virtual MyEnums MyEnum { get; set; }

但是,在我的用例中,全局配置 json.net 会方便得多,这样所有枚举都可以使用 StringEnumConverter 进行(反)序列化,而无需额外的注释。

有没有办法做到这一点,例如在自定义JsonSerializerSettings的帮助下?

【问题讨论】:

    标签: c# .net json json.net


    【解决方案1】:

    StringEnumConverter 添加到JsonSerializerSettings 转换器集合。

    文档:Serialize with JsonConverters


    如果你想让序列化器使用camelCasing,你也可以设置这个:

    SerializerSettings.Converters.Add(
        new StringEnumConverter { CamelCaseText = true });
    

    这会将SomeValue 序列化为someValue

    【讨论】:

    • 我尝试在我的 global.asax.cs 上的 GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings 下进行设置,但没有成功。知道为什么会这样吗?
    • 有没有办法将字段名小写? CamelCaseText 标志被硬编码到类中,我看不到使用不同大小写策略的方法。
    • @mikebridge 你找到解决方案了吗?也在寻找一种方法来自己设置每个枚举选项的名称(或使用小写)。
    • @Timm 是的,我用过这个帖子:stackoverflow.com/questions/6288660/…
    • @mikebridge 谢谢。我发现每个枚举条目的 [EnumMember (Value = "undefined")] 也适用于 JSON.Net(尽管 Microsoft 的 JSON 反序列化器不支持)
    【解决方案2】:

    其他答案适用于 ASP.NET,但如果您想设置这些设置以在任何上下文中调用 JsonConvert,您可以这样做:

    JsonConvert.DefaultSettings = (() =>
    {
        var settings = new JsonSerializerSettings();
        settings.Converters.Add(new StringEnumConverter {CamelCaseText = true});
        return settings;
    });
    

    (见http://james.newtonking.com/archive/2013/05/08/json-net-5-0-release-5-defaultsettings-and-extension-data

    【讨论】:

    【解决方案3】:

    在你的 Global.asax.cs 添加

    HttpConfiguration config = GlobalConfiguration.Configuration;
    config.Formatters.JsonFormatter.SerializerSettings.Converters.Add
                    (new Newtonsoft.Json.Converters.StringEnumConverter());
    

    【讨论】:

    • 这个解决方案似乎非常适合 WebAPI 序列化。谢谢!
    【解决方案4】:

    对于 ASP.NET Core 2,请执行以下操作:

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc()
                    .AddJsonOptions(options =>
                    {
                        options.SerializerSettings.Converters.Add(new StringEnumConverter());
                    });
    
            ...
    

    请注意,这不是services.AddJsonOptions(...),它必须标记到 MVC 上,因为您正在为 MVC 创建设置。

    【讨论】:

      【解决方案5】:

      从版本 12.0.1 开始,之前的答案已经过时。新方法是使用 NamingStrategy。 https://www.newtonsoft.com/json/help/html/NamingStrategyCamelCase.htm

      serializerSettings.Converters.Add(
          new StringEnumConverter { NamingStrategy = new CamelCaseNamingStrategy() }
      );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-27
        • 2016-05-13
        • 2016-01-16
        相关资源
        最近更新 更多