JavaBean转jsonString时首字母大写的问题

这次出差,对接第三方发行系统,又出现了大驼峰命名的json字符串,因此做个笔记记录下。

约定俗成的,JavaBean的属性采用小驼峰命名法。但是,在对接接口的过程中,如果是要去接入别人的接口,如果对方没有使用约定俗成的小驼峰命名,那么也只能自己做出调整适配了。

这样的事情也遇到过几次了。有的是对接自己公司php的接口,有的是对接第三方系统的接口。也许在其他的编程语言中,他们约定俗成的是采用大驼峰命名法,可能有的是全大写。

在编写代码的时候,使用工具类将JavaBean转Json字符串是很常见的操作,或出于打印javaBean,或出于调接口时传输Json格式字符串参数。如果我们希望打印出来的是大驼峰命名或者全大写的属性名,则会发现没有那么简单。

假设有个车辆信息类VehicleInfo:

public class VehicleInfo{private String plateColor;private String plateNo;//省略getter、setter方法
}

使用com.alibaba.fastjson.JSON将bean转json字符串,得到的是:

{"plateColor":"1","plateNo":"京A12345"}

如果,我们希望打印出来的是属性名是大驼峰命名的或者全大写的(确实是有这样的场景),我们可能会这样定义类:

public class VehicleInfo{private String PlateColor;private String PlateNo;//省略getter、setter方法
} //将bean转json字符串,得到的是:
//{"plateColor":"1","plateNo":"京A12345"}

以及

public class VehicleInfo{private String PlateColor;private String PlateNo;//省略getter、setter方法
} //将bean转json字符串,得到的是:
//{"pLATECOLOR":"1","pLATENO":"京A12345"}

由上可知,打印出来的json字符串并没有出现我们预期的结果。

实际上,属性是通过其getter方法和setter方法来操作的。因此,属性名为大驼峰的PlateNo或者小驼峰的plateNo,其默认生成的get方法和set方法都是一样的:setPlateNo和getPlateNo。而在java语言中,对于属性名约定俗成的使用小驼峰命名。因此对于setPlateNo,其属性值是plateNo。
同理,如果属性为PLATENO,其默认生成的get方法为getPLATENO。由小驼峰命名得到其属性名为pLATENO,因此出现了上面那些意料之外的结果。

解决方法

既然在Java中,约定俗成的属性名就是采用小驼峰命名,以上面例子为例,属性名还是写为:plateColorplateNo

解决方法1:@JSONField

大驼峰命名,代码如:

public class VehicleInfo{@JSONField(name = "PlateColor")private String plateColor;@JSONField(name = "PlateNo")private String plateNo;//省略getter、setter方法
}
//打印结果:(预期的结果)
//{"PlateColor":"1","PlateNo":"京A12345"}

全大写命名,代码如:

public class VehicleInfo{@JSONField(name = "PLATECOLOR")private String plateColor;@JSONField(name = "PLATENO")private String plateNo;//省略getter、setter方法
}
//打印结果:(预期的结果)
//{"PLATECOLOR":"1","PLATENO":"京A12345"}

解决方法2:使用PascalNameFilter

普通的,我们这种方式将bean转成json字符串:

System.out.println(JSON.toJSONString(bean);

这时,如果要输出大驼峰命名的Json字符串,可以在JSON.toJSONString方法后面加多一个参数:

//com.alibaba.fastjson
System.out.println(JSON.toJSONString(resultDTO,new PascalNameFilter()))

这样,打印出来的java字符串就是首字母大写的了,其实现效果也好理解,就是将属性名中的首字母全部替换为大写:

if (name != null && name.length() != 0) {char[] chars = name.toCharArray();chars[0] = Character.toUpperCase(chars[0]);String pascalName = new String(chars);return pascalName;
} else {return name;

这种方式使用很方便,但只适用于输出大驼峰命名的json字符串。

最后

以上是两种解决的方法。再不然,还可以自己实现。但是需要注意的是要考虑json的嵌套。

这次出差,有一点感悟是:有的时候,对于一些问题,不要揪得太细,否则可能会影响进度,以及错过其他的一些业务的知识。

20190608 JavaBean转jsonString时首字母大写的问题相关推荐

  1. 单行文字、多行文字溢出时省略号表示的多种解决方式;调整字符间距;段落首字母大写缩进效果;

    文本溢出省略号表示的实现效果: 1.解决单行文字溢出: 解决方式: 在文字容器样式中添加 overflow:hidden; text-overflow:ellipsis; white-space: n ...

  2. java bean 首字母大写_javaBean命名规范 get / set 后的首字母大写

    javaBean命名规范 Sun 推荐的命名规范 1 ,类名要首字母大写,后面的单词首字母大写 2 ,方法名的第一个单词小写,后面的单词首字母大写 3 ,变量名的第一个单词小写,后面的单词首字母大写 ...

  3. fastjson.android首字母大写转化问题

    fastjson.android首字母大写转化问题 使用fastjson转化javabean成json大写首字母变成小写 如果使用的是fastjson的完整版本,可以全局设置 TypeUtils.co ...

  4. java set get大写_javaBean命名规范 get / set 后的首字母大写

    javaBean命名规范 Sun 推荐的命名规范 1 ,类名要首字母大写,后面的单词首字母大写 2 ,方法名的第一个单词小写,后面的单词首字母大写 3 ,变量名的第一个单词小写,后面的单词首字母大写 ...

  5. 使字符串的首字母大写(具有最佳性能)

    我有一个带TextBox的DetailsView ,并且我希望输入数据 总是始终用首字母大写保存 . 例: "red" --> "Red" "r ...

  6. python字符串的切片方式是[n、m、不包括m_python字符串的操作(去掉空格strip(),切片,查找,连接join(),分割split(),转换首字母大写, 转换字母大小写...)...

    #可变变量:list, 字典 #不可变变量:元祖,字符串 字符串的操作(去掉空格, 切片, 查找, 连接, 分割, 转换首字母大写, 转换字母大小写, 判断是否是数字字母, 成员运算符(in / no ...

  7. Python——如何将不规范的英文名字转化为“首字母大写,其他字母小写”的规范名字

    1 致谢 感谢菜鸟教程的指导, 原文链接如下: https://www.runoob.com/python/att-string-format.html 2 前言 今天在学习Python中的函数式编程 ...

  8. 如何在JavaScript中将字符串的首字母大写?

    如何使字符串的第一个字母大写,但不更改其他任何字母的大小写? 例如: "this is a test" -> "This is a test" " ...

  9. pta 循环——首字母大写

    本题目要求编写程序,输入一行字符,将每个单词的首字母改为大写后输出.所谓"单词"是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个. 输入格式: 输入给出一行字符. ...

最新文章

  1. r软件linux 安装失败,R语言在Linux环境下安装Curl出错问题的解决
  2. 用python做频数分析_使用Python进行描述性统计
  3. LeetCode 283. Move Zeroes
  4. xp系统能支持mysql_windowsxp下的mysql集群技术
  5. 如果不考虑钱和面子,你最想做什么工作?
  6. Nginx 配置学习
  7. 数组赋偶数值并求出平均值
  8. mac下nginx搭建
  9. php mysql源码包,linux下Apache+PHP+mysql+phpMyAdmin源码包安装配置
  10. mysql用root账户建立用户和赋予权限
  11. IP地址规划之子网划分
  12. 单片机胡汉才第四版答案_单片机课后习题答案--胡汉才编
  13. 【破解APP抓包限制】Xposed+JustTrustMe关闭SSL证书验证
  14. 【antdesign】表单布局和校验
  15. Python 自然语言处理笔记(五)——信息检索系统,基于Lucene实现
  16. three doors
  17. Coding life,云栖社区的个性化首页上线
  18. BeanUtils怎么没有populate方法
  19. Allegro在PCB中区域规则设置方法
  20. ACE的CDR中的字节对齐问题

热门文章

  1. Java 简易五子棋游戏的编写
  2. 哪些专业不建议跨考计算机
  3. 项目经理等级划分,看看你在哪一级?
  4. java实现打印金字塔
  5. 阿里P6员工炫耀:年薪60万,哪家外企接的住阿里的员工?
  6. post 防篡改_如何防止http请求数据被篡改
  7. 盐城工业职业技术学院计算机没用过,2020年江苏软考盐城工业职业技术学院考点参考人数266人...
  8. Linux与网络服务(一)网络服务相关概念通俗解释(科普向)
  9. 在升龙备份方法_[求助]关于使用再生龙备份系统的问题
  10. 台式电脑如何修复计算机,大神告诉你电脑不断重启如何修复