gpt4 book ai didi

c# - ASP.Net core 中全大写属性名称默认驼峰命名法序列化为 JSON 的问题

转载 作者:行者123 更新时间:2023-12-03 19:23:24 29 4
gpt4 key购买 nike

我对 .Net Core 的默认序列化 CamelCasing 行为有疑问,希望看看其他人是否也遇到同样的问题以及他们使用了什么解决方法。

诸如 FOO12 或 FOO1 之类的属性名称被错误地序列化为诸如

foO12 或 foO1

事实上,它们可能应该被完成为 foo12 或 foo1。

我使用了添加以下属性的解决方法,但希望有人可以对此问题有更好的答案:

[JsonProperty(PropertyName = "foo12")]

最佳答案

Json.NETCamelCasePropertyNamesContractResolver 使用 CamelCaseNamingStrategy 将属性名称转换为驼峰命名法。它在内部使用 StringUtils.ToCamelCase ,如果字符后跟数字,它不会将字符转换为小写,请参阅 link .

驼峰命名策略

public class CamelCaseNamingStrategy : NamingStrategy
{
// ...

protected override string ResolvePropertyName(string name)
{
return StringUtils.ToCamelCase(name);
}
}

StringUtils

请注意第二个 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;
}
}

您可以实现自定义NamingStrategy来实现此缺失检查,如下所示。

class CustomCamelCaseNamingStrategy : CamelCaseNamingStrategy
{
protected override String ResolvePropertyName(String propertyName)
{
return this.toCamelCase(propertyName);
}

private 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]) && !char.IsNumber(array[i + 1]))
{
break;
}
char c = char.ToLower(array[i], CultureInfo.InvariantCulture);
array[i] = c;
}
return new string(array);
}
return s;
}
}

ConfigureServices 中,您将此自定义 NamingStrategy 分配给 CamelCasePropertyNamesContractResolver
无需实现完整的自定义 ContractResolver
(使用默认的 CamelCaseNamingStrategy 时,CamelCasePropertyNamesContractResolver 将属性 ProcessDictionaryKeysOverrideSpecifiedNames 设置为 是的,所以我们保留这种行为。)

services
.AddMvc()
.AddJsonOptions(options =>
options.SerializerSettings.ContractResolver =
new CamelCasePropertyNamesContractResolver() {
NamingStrategy = new CustomCamelCaseNamingStrategy() {
ProcessDictionaryKeys = true,
OverrideSpecifiedNames = true
}});

关于c# - ASP.Net core 中全大写属性名称默认驼峰命名法序列化为 JSON 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52374261/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com