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

在与公司对接的项目中,调用接口时遇到JSON参数首字母大小写不一致的问题。net.sf.json.JSONObject.fromObject()会根据对象的getter方法生成key,导致首字母大写。为了解决这个问题,通过工具类处理JSON,将首字母大写的键转换为小写,并创建忽略数组以应对特殊情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值