如何在 Groovy 中将点号(.)路径键自动转换为嵌套 JSON 结构

风晨吖_2847

风晨吖_2847

2026-07-22

455人浏览

原创

如何在 Groovy 中将点号(.)路径键自动转换为嵌套 JSON 结构

本文介绍一种基于 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()

✅ 关键说明:

Wjs Uploading Video
Wjs Uploading Video

将一个或多个视频上传至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 接口规范或领域模型要求的标准嵌套格式。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

2023.06.20

4316

8

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.28

1335

5

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1738

5

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

2023.08.17

9883

11

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

2023.09.01

960

4

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

2664

5

Js中concat和push的区别
Js中concat和push的区别

Js中concat和push的区别:1、concat用于将两个或多个数组合并成一个新数组,并返回这个新数组,而push用于向数组的末尾添加一个或多个元素,并返回修改后的数组的新长度;2、concat不会修改原始数组,是创建新的数组,而push会修改原数组,将新元素添加到原数组的末尾等等。本专题为大家提供concat和push相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.14

1549

5

js截取字符串的方法介绍
js截取字符串的方法介绍

JavaScript字符串截取方法,包括substring、slice、substr、charAt和split方法。这些方法可以根据具体需求,灵活地截取字符串的不同部分。在实际开发中,根据具体情况选择合适的方法进行字符串截取,能够提高代码的效率和可读性 。

2023.09.21

4569

3

js生成随机数方法
js生成随机数方法

JavaScript生成随机数的方法,包括使用Math.random()方法生成指定范围内的随机整数、生成随机字符串和生成随机颜色。根据具体需求,可以选择适合的方法来生成随机数,以实现各种功能 。

2023.09.25

2635

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.8万人学习