这次出差,对接第三方发行系统,又出现了大驼峰命名的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中,约定俗成的属性名就是采用小驼峰命名,以上面例子为例,属性名还是写为:plateColor
和plateNo
。
大驼峰命名,代码如:
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"}
普通的,我们这种方式将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的嵌套。
这次出差,有一点感悟是:有的时候,对于一些问题,不要揪得太细,否则可能会影响进度,以及错过其他的一些业务的知识。