You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 19:30:17