C# 强制对字典键进行小写JSON序列化,同时对类属性使用驼峰大小写

C# 强制对字典键进行小写JSON序列化,同时对类属性使用驼峰大小写,c#,serialization,json.net,C#,Serialization,Json.net,我拥有以下财产: [JsonProperty()] public Dictionary<string, ICollection<string>> Foo { get; set; } [JsonProperty()] 公共字典Foo{get;set;} 如何使用[JsonProperty]属性强制字典键以所有小写字母序列化 例如,我希望这些键按以下方式序列化: ABC1->ABC1 DEF2->DEF2 我的全局配置(Web API)使用了CamelCa

我拥有以下财产:

    [JsonProperty()]
    public Dictionary<string, ICollection<string>> Foo { get; set; }
[JsonProperty()]
公共字典Foo{get;set;}
如何使用
[JsonProperty]
属性强制字典键以所有小写字母序列化

例如,我希望这些键按以下方式序列化:

  • ABC1->ABC1
  • DEF2->DEF2
  • 我的全局配置(Web API)使用了
    CamelCasePropertyNamesContractResolver
    ,这将导致上述密钥的以下序列化:

  • ABC1->ABC1
  • DEF2->DEF2

  • 您可以通过实现从CamelCaseNamingStrategy派生的自定义
    NamingStrategy
    来解决这个问题。这只是几行代码:

    public class CustomNamingStrategy : CamelCaseNamingStrategy
    {
        public CustomNamingStrategy()
        {
            ProcessDictionaryKeys = true;
            ProcessExtensionDataNames = true;
            OverrideSpecifiedNames = true;
        }
    
        public override string GetDictionaryKey(string key)
        {
            return key.ToLower();
        }
    }
    
    然后将Web API全局配置中的
    CamelCasePropertyNamesContractResolver
    替换为使用新命名策略的
    DefaultContractResolver

    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver = 
        new DefaultContractResolver() { NamingStrategy = new CustomNamingStrategy };
    
    这是一个正在运行的演示(控制台应用程序):


    注意:命名策略通过Json.Net中的
    [JsonProperty]
    [JsonObject]
    属性得到支持,但遗憾的是,当您以这种方式应用策略时,字典键似乎没有得到处理。至少通过resolver设置策略似乎是实现您想要实现的目标的方法。

    您可以通过实现一个自定义
    命名策略来解决此问题,该策略源自
    CamelCaseNamingStrategy
    。这只是几行代码:

    public class CustomNamingStrategy : CamelCaseNamingStrategy
    {
        public CustomNamingStrategy()
        {
            ProcessDictionaryKeys = true;
            ProcessExtensionDataNames = true;
            OverrideSpecifiedNames = true;
        }
    
        public override string GetDictionaryKey(string key)
        {
            return key.ToLower();
        }
    }
    
    然后将Web API全局配置中的
    CamelCasePropertyNamesContractResolver
    替换为使用新命名策略的
    DefaultContractResolver

    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver = 
        new DefaultContractResolver() { NamingStrategy = new CustomNamingStrategy };
    
    这是一个正在运行的演示(控制台应用程序):


    注意:命名策略通过Json.Net中的
    [JsonProperty]
    [JsonObject]
    属性得到支持,但遗憾的是,当您以这种方式应用策略时,字典键似乎没有得到处理。至少通过resolver设置策略似乎是实现您想要实现的目标的方法。

    您可以通过编写自定义类
    DefaultContractResolver
    来实现这一点,只需重写
    ResolveDictionaryKey
    方法来检索小写字符串。@muaz-明白了。然后如何将新的ContractResolver提供给JsonProperty()属性?@tmaurst您不能将该属性用于此操作。您需要一个自定义解析器。对于前面提到的解决方案,另一种解决方案是用另一个类替换
    字典
    ,并在该类中使用小写的
    JsonProperty
    属性名称定义键。只有当
    字典中的键始终是静态的(并且提前知道)时,这才有效。您可以通过编写一个自定义类
    DefaultContractResolver
    来执行此操作。只需重写
    ResolveDictionaryKey
    方法来检索小写字符串。@muaz-明白了。然后如何将新的ContractResolver提供给JsonProperty()属性?@tmaurst您不能将该属性用于此操作。您需要一个自定义解析器。对于前面提到的解决方案,另一种解决方案是用另一个类替换
    字典
    ,并在该类中使用小写的
    JsonProperty
    属性名称定义键。只有当
    字典中的键始终是静态的(并且提前知道)时,这才有效。这段代码只是使属性名小写而不是驼峰大小写!关键字:ToLower()@MohammadNikravesh OP要求字典键都是小写的,而其他的都是驼色的。这就是代码的作用。请参阅下面的代码示例,只需将属性名称改为小写而不是驼峰大小写!关键字:ToLower()@MohammadNikravesh OP要求字典键都是小写的,而其他的都是驼色的。这就是代码的作用。参见上的示例