C# ASP.NETCore中将所有Caps属性名称默认按大小写序列化为JSON时出现问题
我对.NETCore的默认序列化行为有一个问题,希望看看是否有其他人也面临同样的问题,以及他们使用了哪些解决方法 像FOO12或FOO1这样的属性名被错误地序列化为 foO12或foO1 事实上,它们应该作为foo12或foo1来完成 我使用了添加以下属性的变通方法,但希望有人能对此问题有更好的答案: [JsonProperty(PropertyName=“foo12”)]的camelcasePropertyNameContractResolver使用C# ASP.NETCore中将所有Caps属性名称默认按大小写序列化为JSON时出现问题,c#,json,.net-core,asp.net-core-mvc,camelcasing,C#,Json,.net Core,Asp.net Core Mvc,Camelcasing,我对.NETCore的默认序列化行为有一个问题,希望看看是否有其他人也面临同样的问题,以及他们使用了哪些解决方法 像FOO12或FOO1这样的属性名被错误地序列化为 foO12或foO1 事实上,它们应该作为foo12或foo1来完成 我使用了添加以下属性的变通方法,但希望有人能对此问题有更好的答案: [JsonProperty(PropertyName=“foo12”)]的camelcasePropertyNameContractResolver使用CamelCaseNamingStrateg
CamelCaseNamingStrategy
将属性名称转换为camelcase。在内部,它使用StringUtils.ToCamelCase
,如果字符后面跟一个数字,它不会将字符转换为小写,请参阅
CamelCaseNamingStrategy
public class CamelCaseNamingStrategy : NamingStrategy
{
// ...
protected override string ResolvePropertyName(string name)
{
return StringUtils.ToCamelCase(name);
}
}
StringUtils
public class CamelCaseNamingStrategy : NamingStrategy
{
// ...
protected override string ResolvePropertyName(string name)
{
return StringUtils.ToCamelCase(name);
}
}
注意第二个if
语句,其中没有检查数字
internal static class StringUtils
{
public static string ToCamelCase(string s)
{
if (!string.IsNullOrEmpty(s) && char.IsUpper(s[0]))
{
char[] array = s.ToCharArray();
for (int i = 0; i < array.Length && (i != 1 || char.IsUpper(array[i])); i++)
{
bool flag = i + 1 < array.Length;
if ((i > 0 & flag) && !char.IsUpper(array[i + 1])) // << Missing check for a number.
{
break;
}
char c = char.ToLower(array[i], CultureInfo.InvariantCulture);
array[i] = c;
}
return new string(array);
}
return s;
}
}
在ConfigureServices
中,您将此自定义NamingStrategy
分配给CamelCasePropertyNamesContractResolver
无需实现完全定制的
ContractResolver
(当使用默认的
CamelCaseNamingStrategy
时,CamelCasePropertyNamesContractResolver
将属性ProcessDictionaryKeys
和重写特定名称
设置为True
,因此我们保留此行为。)
如果您不喜欢Json.NET的驼峰式外壳的实现,您可以定义自己的替换。是一个开始。哦,不要更改
CamelCasePropertyNamesContractResolver
上的NamingStrategy
,它在所有实例中全局共享合同信息。有关详细信息,请参阅。相反,如果整个应用程序需要这种序列化,那么只需替换DefaultContractResolver
@dbc上的NamingStrategy
,这可能不是问题。我确实理解您所指的情况,因为某些属性被排除在序列化之外,这在该问题中不是全局需要的。如果应用程序的其他部分以前使用未修改的CamelCasePropertyNamesContractResolver
序列化了一些数据,您可能会被烧掉。在这种情况下,稍后设置的CustomCamelCaseNamingStrategy
显然会被忽略。@dbc好的,谢谢,我没有意识到这一点。我将让OP来决定是否使用完全定制的ContractResolver
。序列化的线索仍保留在自定义NamingStrategy
中。但是谢谢,我学到了一些新东西!您不需要子类化DefaultContractResolver
。您只需在常规的旧DefaultContractResolver
上设置自定义命名策略即可,如中所示。实际上,在Json.NET 9.0.1中从契约解析器中分离出命名策略之后,CamelCasePropertyNamesContractResolver
基本上是多余的。
services
.AddMvc()
.AddJsonOptions(options =>
options.SerializerSettings.ContractResolver =
new CamelCasePropertyNamesContractResolver() {
NamingStrategy = new CustomCamelCaseNamingStrategy() {
ProcessDictionaryKeys = true,
OverrideSpecifiedNames = true
}});