琐记(二) JSONObject.fromObject(),首字母大写

JSON实战

    • 背景
    • 问题
    • 矛与盾
    • 思路 &解决

背景

与其他公司的对接项目,要调用对方接口。一切都很正常,如果不是传递的参数有的首字母大写、有的全是大写的话就完美了。将近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,达到预期结果

你可能感兴趣的:(随笔)