
本文介绍一种基于 Groovy 的递归解析与重构策略,将扁平化的点号路径键(如 "sender.senderContactInformation.senderContactPrefix")动态转换为多层嵌套的 JSON 对象结构,无需硬编码路径,适用于任意深度的键名。
本文介绍一种基于 groovy 的递归解析与重构策略,将扁平化的点号路径键(如 `"sender.sendercontactinformation.sendercontactprefix"`)动态转换为多层嵌套的 json 对象结构,无需硬编码路径,适用于任意深度的键名。
在实际 API 集成或数据清洗场景中,常遇到将“扁平键名”(如 a.b.c)映射为真实嵌套 JSON 结构的需求。Groovy 提供了强大的 JsonSlurper 与 JsonBuilder 工具链,配合递归逻辑,可优雅实现该转换。
核心思路不是简单替换 . 为 -(如原答案误用),而是按点分割键名、逐层构建嵌套 Map。以下为正确、健壮的实现方案:
import groovy.json.JsonSlurper
import groovy.json.JsonBuilder
def jsonText = '''[{"sender.senderContactInformation.senderContactPrefix": "Mr.",
"sender.senderContactInformation.senderContactMiddleInitial": "man",
"ord.ordToAddr1": "US",
"dummy-target": "dummydefault",
"sender.senderContactInformation.SenderContactType": "",
"senderIdentifierName": "Abcxyz",
"orderLineItems": [{"orderLineItemActionCode": "78",
"OrderLineItemQuantity": "1",
"patientID": "CKIO090",
"defender.defenderContactInformation": "",
"orderLineItemDetails": [{"orderLineItemDetailCode": "1",
"ds1.dsType.dsName": ""}]}]}]'''
def parseAndNest(jsonStr) {
def root = new JsonSlurper().parseText(jsonStr)
// 递归处理每个 Map 层级
def nestKeys = { obj ->
if (obj instanceof Map) {
def result = [:]
obj.each { key, value ->
if (key.contains('.')) {
// 拆分路径:a.b.c → ['a', 'b', 'c']
def parts = key.split('\.')
def nestedMap = result
// 逐层创建嵌套 Map,直到倒数第二级
parts[0..-2].each { part ->
nestedMap = nestedMap.get(part) ?: { nestedMap[part] = [:]; nestedMap[part] }()
}
// 将值赋给最后一级键
nestedMap[parts.last()] = value instanceof Map ? nestKeys(value) : value
} else {
result[key] = value instanceof Map ? nestKeys(value) : value
}
}
return result
} else if (obj instanceof List) {
return obj.collect { nestKeys(it) }
} else {
return obj
}
}
return nestKeys(root)
}
def transformed = parseAndNest(jsonText)
println new JsonBuilder(transformed).toPrettyString()
✅ 关键说明:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 使用 split('\.') 正确处理点号(需转义);
- 利用闭包内联逻辑动态构建嵌套 Map,避免中间变量污染;
- 递归支持任意层级嵌套及混合结构(Map/List/原始值);
- 原始非点号键(如 "dummy-target"、"senderIdentifierName")保持原样;
- 空字符串、null 等值均被原样保留,不额外过滤。
⚠️ 注意事项:
- 若存在冲突键(如同时存在 "a.b" 和 "a"),后出现者会覆盖前者——建议确保输入键路径无歧义;
- 该方案不修改原始 JSON 的语义结构(如数组顺序、空值含义),严格保真;
- 生产环境建议增加异常捕获(如 JsonParseException)并做日志记录。
通过此方法,你可将任意含点号路径的扁平 JSON 数据,全自动、可扩展地重构为符合 REST 接口规范或领域模型要求的标准嵌套格式。










