Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NETCore中将所有Caps属性名称默认按大小写序列化为JSON时出现问题_C#_Json_.net Core_Asp.net Core Mvc_Camelcasing - Fatal编程技术网

C# ASP.NETCore中将所有Caps属性名称默认按大小写序列化为JSON时出现问题

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

我对.NETCore的默认序列化行为有一个问题,希望看看是否有其他人也面临同样的问题,以及他们使用了哪些解决方法

像FOO12或FOO1这样的属性名被错误地序列化为

foO12或foO1

事实上,它们应该作为foo12或foo1来完成

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

[JsonProperty(PropertyName=“foo12”)]

的camelcasePropertyNameContractResolver使用
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 
        }});