fastjson转换json时,碰到的那些首字母大小写转换的坑

news/2025/10/16 12:45:17/文章来源:https://www.cnblogs.com/h2285409/p/19145337

fastjson转换json时,碰到的那些首字母大小写转换的坑

转自:java - fastjson转换json时,碰到的那些首字母大小写转换的坑! - agamem - SegmentFault 思否

 

在api的处理过程里面,bean转换成json时,我们总是希望字段名是什么样的,转换成json就应该是什么样的,然而现实总是残酷的。

坑0x01 全大写的键名

这种情况在api定义里面很常见,如下:

private String TEST = “1”;
public String getTEST() { return this.TEST}

在fastjson转换后,变成:json{ “tEST”: ”1”},与预期不符,首字母变成小写了。

原因:
fastjson在将bean转换为json时,先取出对应的methodName: getTEST,从methodName的第4个字符开始,取出propertyName:TEST,它默认认为这个propertyName的首字母是在定义getter的时候被写成大写的,现在要转成小写:
propertyName = Character.toLowerCase(methodName.charAt(3)) + methodName.substring(4);
结果,正确的TEST就被转成错误的tEST了。

解决:
解决这个问题比较简单,在转换前,多加一行代码:
TypeUtils.compatibleWithJavaBean =true;
此时,fastjson会先判断propertyName长度大于1、且头两个字符都是大写时,不做转换:

if(name.length() > 1 && Character.isUpperCase(name.charAt(1)) && Character.isUpperCase(name.charAt(0))){return name;
}

也就是说,连续大写开头的propertyName,在转换时,会保持原样。

坑0x02 第一个字符大写,第二个字符不是大写的键名

按坑0x01里面讲的设置TypeUtils.compatibleWithJavaBean=true后,如果有如下的键名,依然会出问题:

private String T_EST = “1”;
private String Test = “2”;
public String getT_EST() { return this.T_EST}
public String getTest() { return this.Test}

在fastjson转换后,变成:{ “t_EST”: ”1”, “test”:”2”},又是一个坑。

原因:
从坑0x01的最后一段代码可以看出,要想fastjson不改首字符,除了需要设置compatibleWithJavaBean外,propertyName的第二个字符也必须是大写。在坑0x02这里,两个propertyName都无法通过判断,首字母就要被转换成小写了。

解决
要解决这个问题,在转换前,必须再加一行代码:
TypeUtils.compatibleWithFieldName = true;
Fastjson里面对应的处理代码如下:

if(compatibleWithFieldName){if(!fieldCacheMap.containsKey(propertyName)){String tempPropertyName = methodName.substring(fromIdx);return fieldCacheMap.containsKey(tempPropertyName) ? tempPropertyName : propertyName;}
}

fastjson在按坑0x01所述的过程处理完propertyName后,propertyName的首字符被转换为小写,然后会在bean的的field列表里面找一遍转换后的名称。如果找不到,就从methodName里面重新取get后面的字符串,然后再到field列表里面找一遍,如果找到,就用原propertyName,如果找不到就用首字符被转换的名称。

坑0x03 首字符小写,第二个字符大写的键名

这个坑与lombok相关,严格来说,应该是lombok挖的坑。
如上所述,就算你按坑0x01、0x02设置了,如果在工程里面用lombok时,有如下的键名定义,依然要被坑:

@Getter
private String iPhone = “1”;

在fastjson转换后,变成:{ “IPhone”: ”1” },首字符变大写了,WTF!

原因:
Lombok在自动生成getter的时候,会把propertyName的第一的字母改成大写,等同如下代码:

public String getIPhone(){return this.iPhone;}

问题就出在这个转换上,get后面紧跟的字符变成大写了。在eclipse、idea里面,如果自动生成代码,get后的字符是小写。

如前面坑0x01最后一段代码,fastjson在处理getter时,会判断前两个字符是不是大写,如果是的话,就保持原样,取到的propertyName就成了:IPhone。但是在field列表里面,对应的propertyName是iPhone,就算开启了compatibleWithFieldName,fastjson用从getter中解析出来的IPhone,在field列表里面也找不到对应值,也只能保持IPhone这个名称了。

另外,就算在属性前用了@JSONField(name = “iPhone”)注解,因为fastjson用从getter解析出来的propertyName找不到对应的field,也无法读出该field对应的注解,这个注解也是无效的。

解决

  1. 碰到这种propertyName,就不要用lombok生成的getter/setter了,自己写,保持首字符小写,如:getiPhone/setiPhone,只要在代码里面有这两个方法,lombok就不会自动生成,lombok是按忽略大小写后的propertyName判断的。
  2. 把propertyName第二个字符改成小写,或者重新取个名字,并用@JSONField注明正确的名称,如:

    @Getter
    @ JSONField(name = “iPhone”)
    private String iphone = “1”;

    关于lombok的这个坑,可以参考:http://xxxx.ooo/2017/using-lo...,lombok的作者也是死鸭子嘴硬,被提了n多的issue,就是不改。

  3. @ JSONField(name = “IPhone”) 待验证

以上,就是本汪在项目里面填坑的过程,不要问我为什么api里面的字段名称会定义成这副模样,本汪也不知道,汪!汪!!汪!!!

关于fastjson的代码,都在TypeUtils.computeGetters里面。
@JSONField是个好东西,不嫌麻烦的话,就都加上吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/938167.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年10月龙骨机厂家最新推荐榜,轻钢,装配式建筑,高速,全自动,吊顶,隔墙,高精度,快装式,方通龙骨龙骨机推荐这十家公司!

在当前建筑与机械制造行业快速发展的背景下,龙骨机作为冷弯机械领域的重要设备,其质量、性能与服务直接影响着下游企业的生产效率与工程质量。然而,市场上龙骨机制造商数量众多,产品质量参差不齐,技术水平差异明显…

命令行AI编程工具Jules Tools发布解析

某中心实验室推出Jules Tools命令行工具,让开发者能在终端直接使用AI编程助手。该工具基于Gemini模型,可自动修复代码错误、编写测试用例,支持异步编程操作,显著提升开发效率。通过npm即可安装使用。命令行AI编程工…

2025年东莞脱模剂混合机厂家最新权威推荐榜:专业设备与高效服务深度解析,优质供应商联系方式全收录

2025年东莞脱模剂混合机厂家最新权威推荐榜:专业设备与高效服务深度解析在制造业快速发展的今天,脱模剂混合机作为生产过程中不可或缺的关键设备,其性能优劣直接影响产品质量和生产效率。随着工业4.0时代的到来,脱…

10 封装和继承的概念

10 封装和继承的概念面向对象2 封装和继承的概念 封装 程序设计的追求:高内聚、低耦合 ​ 即内部数据操作细节自己完成,不允许外部干涉。 ​ 仅暴露少量的方法供外部使用。 属性私有,get、setprivate :私有 无法直…

2025年破胶机厂家TOP企业品牌推荐排行榜,610,710,810,大型,自动型,低温环保,节能省电,自动打块,轮胎破胶机公司推荐

在废旧橡胶回收再利用行业蓬勃发展的当下,破胶机作为关键设备,其性能与质量直接影响着生产效率和产品品质。然而,当前市场上破胶机制造商数量众多,产品质量参差不齐,技术水平也存在较大差异。部分厂家生产的设备存…

OceanBase素材字典和性能视图

OceanBase素材字典和性能视图pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

2025年10月品牌设计公司推荐排行榜,聚焦企业综合实力与核心竞争力

在当前商业竞争日益激烈的市场环境下,品牌设计已成为企业塑造独特形象、提升市场竞争力的关键环节。然而,品牌设计行业却面临着诸多亟待解决的问题。一方面,部分品牌设计机构缺乏专业的战略思维,仅将设计停留在表面…

2025年3C铝型材厂家行业标杆:船舶铝材/电力铝材/3C铝材廊坊国美铝业,21项专利加持,全品类适配获五星推荐

随着新能源汽车、绿色建筑等产业加速升级,铝型材作为轻量化核心材料,市场需求在 2025 年持续攀升。但行业扩张也带来品质参差问题,企业选购时常面临耐腐蚀性难验证、场景适配错配、环保合规不达标等困扰。为帮助企业…

实用指南:pink老师html5+css3day01

实用指南:pink老师html5+css3day012025-10-16 12:26 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !imp…

2025年工业机器人厂家最新权威推荐榜:专业集成与智能应用解决方案深度解析

2025年工业机器人厂家最新权威推荐榜:专业集成与智能应用解决方案深度解析随着工业4.0时代的深入发展,工业机器人已成为制造业转型升级的核心驱动力。根据国际机器人联合会最新数据,全球工业机器人安装量预计在2025…

what is 8.3 file-naming convention?

The term “8.3 filenames” refers to the legacy file-naming convention used by MS-DOS and early versions of Windows (as well as FAT file systems) in which file names were limited to:8 characters for th…

2025智慧水务平台

随着国家“十四五”智慧水利规划落地,这场以数字孪生和AI决策为核心的水务革命,正悄然重构城市命脉。一、核心架构:1+2+3+N+X的“智慧水脑” 1. 底层逻辑:全域感知神经网 物联网+5G:百万级传感器实时采集水质、流…

what is .NFO?

FROM CHATGPT, OF COURSE.An .NFO file (short for info file) is a plain text file traditionally used to provide information, metadata, and notes about a particular release, most notably in software, ware…

机惨

rt: 有时候开开玩笑可以,你太过分就有点烦人了 你机惨我我其实不很气,我知道你只是想找点乐子(给别人看看你推) 哦那你就往我桌面上粘300多张?删都删不干净,那不纯有病吗?(惨完我你还笑得挺开心的) 最后没办法…

auipc指令在NEMU中的执行过程 - Zeeh

auipc指令在NEMU中的执行过程假设指令集为RV64I内存地址开始于0x8000 0000使用如下的代码: static const uint32_t img [] = {0x00000297, // auipc t0,00x00028823, // sb zero,16(t0)0x0102c503, // lbu a0,16(…

如何在AutoCAD中进行GIS空间查询?

借助GIS4CAD插件,可以在AutoCAD中像ArcGIS一样对图形数据进行空间查询,通过图层间的相交或包含关系,可以根据条件将符合要求的图形快速选中。这样可以快速筛选出符合特定空间位置条件的图形元素,显著提升CAD数据处…

initContainers实现整个数据目录的挂载

在部署mysql、oracle、tomcat测试时,面对配置文件非常多的情况下一个个挂载配置文件会显得非常麻烦,这时就可以通过将服务的整个数据目录给挂载下来,以方便修改配置和数据,但是因为服务需要初始化,直接挂载目录会…

消息队列常见问题克服(偏kafka)—顺序消费、消息积压、消息丢失、消息积压、分布式事务

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年屋脊通风天窗厂家最新权威推荐榜:工业厂房自然通风解决方案优选品牌

2025年屋脊通风天窗厂家最新权威推荐榜:工业厂房自然通风解决方案优选品牌随着工业建筑节能环保要求的不断提高,屋脊通风天窗作为工业厂房自然通风系统的核心设备,其技术性能与产品质量日益受到行业重视。在碳中和目…

学霸的期末 解题报告

简要题意 给定 \(n\) 个点 \(m\) 条边的有向图,在不改变图的连通性的前提下,删除任意条边后,最少可以保留多少条边;和任意加边后,最多可以包含多少条边。 数据范围:\(nm \le 5 \times 10 ^7,n \le 10^3,m\le 10^…