Java如何将JSONObject的所有键名转换为小写形式
JSONObject所有键名统一转为小写的最佳实现
多次转换失败基本都源于两个共性问题:
- 仅处理了最外层的键名,没有递归处理嵌套的JSONObject、JSONArray内部结构,导致深层键名保留原大小写
- 直接在原JSONObject对象上遍历键的同时执行删键、写键操作,触发迭代器并发修改异常,导致转换逻辑中断
以下是覆盖所有嵌套场景的稳定实现,根据项目引入的JSON类库选择对应代码即可:
1. 基于Alibaba Fastjson的实现
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import java.util.Map; public class JsonKeyConvertUtil { /** * 将JSONObject所有键(含嵌套结构)转为小写 * @param origin 原JSONObject对象 * @return 键名全小写的新JSONObject对象 */ public static JSONObject allKeyToLower(JSONObject origin) { JSONObject target = new JSONObject(); for (Map.Entry<String, Object> entry : origin.entrySet()) { // 键名直接转小写 String newKey = entry.getKey().toLowerCase(); Object value = entry.getValue(); // 值为嵌套JSONObject时递归处理 if (value instanceof JSONObject) { value = allKeyToLower((JSONObject) value); } // 值为JSONArray时遍历数组处理内部元素 else if (value instanceof JSONArray) { value = convertArrayKeyToLower((JSONArray) value); } target.put(newKey, value); } return target; } private static JSONArray convertArrayKeyToLower(JSONArray originArray) { JSONArray targetArray = new JSONArray(); for (Object item : originArray) { if (item instanceof JSONObject) { targetArray.add(allKeyToLower((JSONObject) item)); } else if (item instanceof JSONArray) { targetArray.add(convertArrayKeyToLower((JSONArray) item)); } else { // 普通基础类型值直接透传 targetArray.add(item); } } return targetArray; } // 测试验证 public static void main(String[] args) { String testStr = "{\"UserName\":\"zhangsan\",\"Age\":22,\"Dept\":{\"DeptName\":\"研发中心\",\"DeptId\":3},\"Roles\":[{\"RoleCode\":\"dev\",\"RoleName\":\"开发\"}]}"; JSONObject origin = JSON.parseObject(testStr); JSONObject lowerKeyJson = allKeyToLower(origin); // 输出结果:{"username":"zhangsan","age":22,"dept":{"deptname":"研发中心","deptid":3},"roles":[{"rolecode":"dev","rolename":"开发"}]} System.out.println(lowerKeyJson.toJSONString()); } }
2. 基于官方org.json包的实现
逻辑和Fastjson版本完全一致,仅适配org.json的API差异:
import org.json.JSONArray; import org.json.JSONObject; import java.util.Iterator; public class OrgJsonKeyConvertUtil { public static JSONObject allKeyToLower(JSONObject origin) { JSONObject target = new JSONObject(); Iterator<String> keyIterator = origin.keys(); while (keyIterator.hasNext()) { String originKey = keyIterator.next(); String newKey = originKey.toLowerCase(); Object value = origin.get(originKey); if (value instanceof JSONObject) { value = allKeyToLower((JSONObject) value); } else if (value instanceof JSONArray) { value = convertArrayKeyToLower((JSONArray) value); } target.put(newKey, value); } return target; } private static JSONArray convertArrayKeyToLower(JSONArray originArray) { JSONArray targetArray = new JSONArray(); for (int i = 0; i < originArray.length(); i++) { Object item = originArray.get(i); if (item instanceof JSONObject) { targetArray.add(allKeyToLower((JSONObject) item)); } else if (item instanceof JSONArray) { targetArray.add(convertArrayKeyToLower((JSONArray) item)); } else { targetArray.add(item); } } return targetArray; } }
关键注意事项
- 禁止直接修改原对象:新建空JSONObject承载转换后的键值对,从根源上避免遍历过程中的并发修改异常,也不会污染原始JSON数据
- 递归逻辑必须覆盖三类值:基础类型值直接透传、嵌套JSONObject递归转键、嵌套JSONArray遍历处理内部元素,缺任意一类都会出现部分键转换遗漏
- 如果业务中存在超过1000层的极端深JSON结构,可以将递归逻辑改为显式栈的广度遍历实现,避免栈溢出,常规业务场景递归实现性能和可读性最优
- 如果使用Jackson、Gson等其他JSON类库,核心逻辑完全通用,仅需替换对应JSON节点的API即可
内容的提问来源于stack exchange,提问作者Matheus Victor Araújo Ferreira
相关产品推荐
相关产品推荐

