当前位置: 首页 > news >正文

使用camel模式的WebApi接口中全大写的属性名称变成全小写的问题(续)

  System.Text.Json模块的JsonNamingPolicy类是管理JSON 属性名命名格式的基类,其常用子类包括以下几种,其中JsonCamelCaseNamingPolicy,也即驼峰命名法,就是上篇文章中介绍的将全大写属性名称序列化为全小写的类。

序号类名说明
1JsonCamelCaseNamingPolicy驼峰命名法
2JsonSnakeCaseLowerNamingPolicy蛇形命名法,分隔符为"_",全小写,如first_name, user_id,
3JsonSnakeCaseUpperNamingPolicy蛇形命名法,分隔符为"_",全大写 ,如FIRST_NAME, USER_ID
4JsonKebabCaseLowerNamingPolicy烤肉串命名法,分隔符为"-",全小写,如first-name, user-id
5JsonKebabCaseUpperNamingPolicy烤肉串命名法,分隔符为"-",全大写,如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

http://www.dtcms.com/a/406085.html

相关文章:

  • pulp解析器测试开发排产
  • 【开题答辩全过程】以 “辛巴克餐饮”小程序为例,包含答辩的问题和答案
  • bazel编译
  • 7、微服务中 DTO、VO、PO、BO 的设计规范
  • 建工之家祁阳seo
  • 自动跳转手机网站代码在线生成网站地图
  • 公司网站建设 邮箱潍坊网站开发
  • Redisson和Zookeeper实现的分布式锁
  • 基于51单片机宠物喂食系统设计
  • 游戏外挂和游戏逆向的关系
  • 【Vue3 ✨】Vue3 入门之旅 · 第九篇:Vue3 插槽机制
  • linux系统(ubuntu)安装mysql8详细教程
  • web微服务介绍
  • MongoDB副本集
  • 408操作系统复习笔记——关于IO层次结构与执行流程-冲刺120+
  • 微信认证 网站wordpress音乐插件歌词
  • Ansible Playbook
  • ARM—时钟(CLOCK)—定时器(EPIT / GPT)
  • 基于IMX6ULL的时钟,定时器(EPIT,GPT)
  • HCIE 的云计算方向容易考过吗?该怎么准备考试?
  • 凤山县住房和城乡建设局网站wordpress中国能用吗
  • 从 EFI 到 GPT:深入理解现代计算机启动与磁盘分区技术
  • 计算机网络的性能指标和体系结构
  • 性能怪兽:GPT-5-Codex三大核心进化,重新定义AI编程
  • 网络通信协议全解析:HTTP/UDP/TCP核心要点
  • 郴州网站建设软件定制开发平台e盘网站建设
  • 在Unix/Linux中bash/sh/source以及./执行脚本的区别
  • 宜春公司做网站双语网站建设定制开发
  • Spring Boot 应用启动组件加载顺序与优先级详解
  • Spring Boot 事件发布与监听 观察者模式的实际应用