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

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的嵌套。

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

你可能感兴趣的:(java-web,工作总结,记录)