背景
与其他公司的对接项目,要调用对方接口。一切都很正常,如果不是传递的参数有的首字母大写、有的全是大写的话就完美了。将近20个参数,怎么传,写了BO类,转为JSON格式传递过去。那么问题来了。。。
问题
net.sf.json.JSONObject.fromObject(obj)
方法会根据obj类的getter方法生成JSON的key值。
我看到的规则:
getter方法示例 | 备注 | JSON中key值 |
---|---|---|
getAb() | get后第一个字母大写,之后字母小写(最常见的getter方法) | ab |
getAB() | get后第一个字母大写,之后字母大写 | AB |
getab() | get后第一个字母小写,之后的字母小写 | ab |
getaB() | get后第一个字母小写,之后字母大写 | aB |
后三种相当于没有转换,只有第一个种情况会让key值进行转换
即使没有私有变量A,有getA()方法也会在JSON中添加A键值
矛与盾
class Person{
private String Name;
public String getName() {
return this.Name;
}
public void setName(String name) {
this.Name = name;
}
}
Person p = new Person();
p.setPerson("My_Name");
JSONObject json = JSONObject.fromObject(p);
System.out.println(json);
// OUTPUT
{"name": "My_Name"}
而我想要的不是这啊,首字母大写呢?
思路 &解决
在工具类处理得到的Json,将首字母大写转为小写,并且为了应对有的变量不用首字母大写的情况,添加忽略数组。具体代码如下:
class Tool {
public static JSONObject fromObject(Object obj, String[] excludes) {
// 用来接收处理后的键值对
JSONObject result = new JSONObject();
List excludeList = null;
if (excludes != null) {
excludeList = Arrays.asList(excludes);
}
JSONObject srcJson = JSONObject.fromObject(obj);
Iterator<String> keys = srcJson.keys();
while(keys.hasNext()) {
String key = keys.next();
// 是否忽略该Key
if (excludeList != null && excludeList.contains(key)) {
result.put(key, srcJson.get(key));
continue;
}
char[] chars = key.toCharArray();
if (key.length() > 1 && Character.isLowerCase(chars[0])) {
// 首字母大写
chars[0] = Character.toUpperCase(chars[0]);
}
result.put(String.valueOf(chars), srcJson.get(key));
}
return result;
}
}
Person p = new Person();
p.setPerson("My_Name");
JSONObject json = Tool.fromObject(p, null);
System.out.println(json);
// OUTPUT
{"Name": "My_Name"}
OK,达到预期结果