使用camel模式的WebApi接口中全大写的属性名称变成全小写的问题(续)
System.Text.Json模块的JsonNamingPolicy类是管理JSON 属性名命名格式的基类,其常用子类包括以下几种,其中JsonCamelCaseNamingPolicy,也即驼峰命名法,就是上篇文章中介绍的将全大写属性名称序列化为全小写的类。
序号 | 类名 | 说明 |
---|---|---|
1 | JsonCamelCaseNamingPolicy | 驼峰命名法 |
2 | JsonSnakeCaseLowerNamingPolicy | 蛇形命名法,分隔符为"_",全小写,如first_name, user_id, |
3 | JsonSnakeCaseUpperNamingPolicy | 蛇形命名法,分隔符为"_",全大写 ,如FIRST_NAME, USER_ID |
4 | JsonKebabCaseLowerNamingPolicy | 烤肉串命名法,分隔符为"-",全小写,如first-name, user-id |
5 | JsonKebabCaseUpperNamingPolicy | 烤肉串命名法,分隔符为"-",全大写,如FIRST-NAME, USER-ID |
调用JsonCamelCaseNamingPolicy的ConvertName函数可以测试字符串转换效果,如下测试代码所示,全大写的字符串会被转换为全小写字符串。
Console.WriteLine(JsonNamingPolicy.CamelCase.ConvertName("TEST"));
Console.WriteLine(JsonNamingPolicy.CamelCase.ConvertName("tEST"));
Console.WriteLine(JsonNamingPolicy.CamelCase.ConvertName("TeST"));
Console.WriteLine(JsonNamingPolicy.CamelCase.ConvertName("TesT"));
从参考文献1中下载System.Text.Json模块源码,并在src\libraries\System.Text.Json\Common文件夹下找到JsonCamelCaseNamingPolicy类的源码,如下所示,ConvertName函数的大致实现逻辑为如果字符串首字母非大写则直接返回字符串,否则调用FixCasing函数逐字母判断是否为大写字母,如果连续都是大写字母,则会一直循环将大写转换为小写。
internal sealed class JsonCamelCaseNamingPolicy : JsonNamingPolicy{public override string ConvertName(string name){if (string.IsNullOrEmpty(name) || !char.IsUpper(name[0])){return name;}#if NETreturn string.Create(name.Length, name, (chars, name) =>{name.CopyTo(chars);FixCasing(chars);});
#elsechar[] chars = name.ToCharArray();FixCasing(chars);return new string(chars);
#endif}private static void FixCasing(Span<char> chars){for (int i = 0; i < chars.Length; i++){if (i == 1 && !char.IsUpper(chars[i])){break;}bool hasNext = (i + 1 < chars.Length);// Stop when next char is already lowercase.if (i > 0 && hasNext && !char.IsUpper(chars[i + 1])){// If the next char is a space, lowercase current char before exiting.if (chars[i + 1] == ' '){chars[i] = char.ToLowerInvariant(chars[i]);}break;}chars[i] = char.ToLowerInvariant(chars[i]);}}}
参考文献
[1]https://github.com/dotnet/runtime/tree/main/src