
本文介绍如何使用 java 高效、安全地将任意结构的 json(含嵌套对象和数组)中的所有键名统一转换为大写,推荐采用 josson 库实现语义化键名转换,避免正则误匹配值内容或破坏 json 结构。
本文介绍如何使用 java 高效、安全地将任意结构的 json(含嵌套对象和数组)中的所有键名统一转换为大写,推荐采用 josson 库实现语义化键名转换,避免正则误匹配值内容或破坏 json 结构。
在处理 JSON 数据时,若需统一规范键名格式(如全部转为大写),直接使用正则表达式(如 replaceAll("\"([a-zA-Z0-9_]+)\":", "\"$1\".toUpperCase():"))看似简洁,实则风险极高:它无法区分键名与字符串值(例如 "name": "John" 中的 "John" 也可能被错误匹配)、不识别嵌套层级、易破坏引号/转义结构,且对数组、空对象、null 值等边界情况缺乏鲁棒性。
更可靠的方式是基于 JSON 语法树进行语义化处理——即先解析为结构化对象,递归遍历所有键名并转换,再序列化输出。Josson 是一个轻量、无依赖的 Java JSON 转换库,专为 JSON 路径查询与函数式变换设计,其 flatten() → map() → unflatten() 流式操作天然适配此类需求。
以下为完整实现步骤:
✅ 引入依赖(Maven)
<dependency>
<groupId>com.octomix.josson</groupId>
<artifactId>josson</artifactId>
<version>1.6.13</version>
</dependency>✅ 核心代码(支持任意嵌套)
import com.octomix.josson.Josson;
import com.fasterxml.jackson.databind.JsonNode;
public class JsonKeyUppercaser {
public static String uppercaseAllKeys(String jsonString) {
Josson josson = Josson.fromJsonString(jsonString);
// flatten: 将嵌套结构展平为键路径(如 "Shipments[0].shipmentId")
// entries(): 获取所有 (key, value) 对
// map(key.upperCase()::value): 将每个键转大写,保留原值
// mergeObjects(): 合并为单个对象
// unflatten('.'): 按点号路径重建嵌套结构
JsonNode result = josson.getNode(
"flatten('.').entries().map(key.upperCase()::value).mergeObjects().unflatten('.')"
);
return result.toPrettyString(); // 或 .toString() 去格式化
}
// 使用示例
public static void main(String[] args) {
String input = "{\n" +
" \"transactionId\": 181,\n" +
" \"Shipments\": [\n" +
" {\n" +
" \"shipmentId\": 2,\n" +
" \"picklistId\": \"24RZ\",\n" +
" \"ExtOrderId\": \"23-127\",\n" +
" \"boxType\": \"120\"\n" +
" }\n" +
" ]\n" +
"}";
System.out.println(uppercaseAllKeys(input));
}
}⚠️ 注意事项
- Josson 默认使用 Jackson:确保项目中已引入 jackson-databind(Josson 1.6+ 已内置兼容版本);
- 键路径分隔符:flatten('.') 中的 . 是默认路径分隔符,若原始 JSON 键名含点号(极少见),可改用 flatten('_') 并同步调整 unflatten('_');
- 数组索引处理:flatten() 自动将数组转为 [0], [1] 等形式,unflatten() 可精确还原,无需手动处理;
- 性能考量:对于超大 JSON(>10MB),建议结合流式解析器(如 Jackson Streaming API)做分块处理;但常规业务场景下 Josson 性能足够;
- 替代方案对比:若受限于技术栈无法引入第三方库,可基于 Jackson 的 JsonNode 手动递归遍历(需自定义 ObjectNode 重写逻辑),但代码量与维护成本显著增加。
该方案以声明式链式调用完成“解析→展平→键转换→重构”全流程,兼具可读性、健壮性与扩展性,是生产环境中推荐的 JSON 键名标准化实践。










