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]
属性强制字典键以所有小写字母序列化
例如,我希望这些键按以下方式序列化:
CamelCasePropertyNamesContractResolver
,这将导致上述密钥的以下序列化:
您可以通过实现从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要求字典键都是小写的,而其他的都是驼色的。这就是代码的作用。参见上的示例