新闻中心
JOLT JSON转换:将数组中的多个独立对象合并为单个对象

本文详细介绍了如何使用jolt转换规范,将json数组中原本独立的多个对象合并为一个单一对象。通过在`shift`操作中使用共同的数组索引`[0]`,可以有效消除不必要的嵌套层级,从而实现更紧凑、符合预期的输出结构。文章提供了具体的jolt配置示例和解释,帮助读者掌握此类复杂数据重塑技巧。
JOLT中的数组对象合并问题解析
在使用JOLT进行JSON数据转换时,一个常见的需求是将源JSON中的多个字段映射到目标JSON数组中的一个单一对象内。然而,如果不正确地构造JOLT shift 规范,可能会导致每个源字段在目标数组中生成一个独立的子对象,而非预期的合并结构。
考虑以下输入JSON结构,其中包含了一系列资产相关的信息:
输入 JSON 示例:
{
"AssetID": "1",
"AssetNumber": "2",
"AssetMaterial": "Cisco MDS 9706",
"RackUnits": "9.0",
"MaterialType": "Chassis",
"AssetName": "Cisco-MDS-9706_1",
"CustRID": "A001",
"SerialNumber": "OU812",
"Room": "ROOM5",
"Datacenter": "DC69",
"UMountingID": "86",
"CabinetAssetID": "181",
"CabinetName": "CAB666"
}如果使用如下的JOLT shift 规范:
[
{
"operation": "shift",
"spec": {
"AssetID": "data[].6.value",
"AssetNumber": "data[].7.value",
"AssetMaterial": "data[].8.value",
"AssetName": "data[].9.value",
"CustRID": "data[].10.value",
"SerialNumber": "data[].11.value",
"Room": "data[].12.value",
"Datacenter": "data[].13.value",
"UMountingID": "data[].14.value",
"CabinetAssetID": "data[].15.value&qu
ot;,
"CabinetName": "data[].16.value"
}
}
]上述规范会产生以下输出,其中 data 数组的每个元素都是一个独立的JSON对象,包含了源JSON中的一个字段:
当前输出 JSON 示例:
{
"data": [
{ "6": { "value": "1" } },
{ "7": { "value": "2" } },
{ "8": { "value": "Cisco MDS 9706" } },
{ "9": { "value": "Cisco-MDS-9706_1" } },
{ "10": { "value": "A001" } },
{ "11": { "value": "OU812" } },
{ "12": { "value": "ROOM5" } },
{ "13": { "value": "DC69" } },
{ "14": { "value": "86" } },
{ "15": { "value": "181" } },
{ "16": { "value": "CAB666" } }
]
}然而,我们期望的输出是将所有这些字段合并到 data 数组中的一个单一对象内,结构如下:
期望输出 JSON 示例:
{
"data" : [
{
"6" : { "value" : "1" },
"7" : { "value" : "2" },
"8" : { "value" : "Cisco MDS 9706" },
"9" : { "value" : "Cisco-MDS-9706_1" },
"10" : { "value" : "A001" },
"11" : { "value" : "OU812" },
"12" : { "value" : "ROOM5" },
"13" : { "value" : "DC69" },
"14" : { "value" : "86" },
"15" : { "value" : "181" },
"16" : { "value" : "CAB666" }
}
],
"to" : "table1",
"fieldsToReturn" : [ 6, 7, 8, 9, 10, 11, 12 ]
}解决方案:利用共同的数组索引
问题的核心在于 data[].key.value 中的 [] 操作符。当JOLT遇到 [] 时,它会为每个匹配的源路径在目标数组中创建一个新的元素。为了将所有字段合并到数组的同一个元素中,我们需要指定一个共同的数组索引。最简单且常用的方法是使用 [0]。
将 data[].key.value 修改为 data[0].key.value 即可实现这一目标。这意味着所有转换后的字段都将被放置到 data 数组的第一个元素(索引为0)所代表的对象中。
Moshi Chat
法国AI实验室Kyutai推出的端到端实时多模态AI语音模型,具备听、说、看的能力,不仅可以实时收听,还能进行自然对话。
160
查看详情
此外,原始JOLT规范中包含了一个冗余的 default 操作来添加 "to": "table1"。这个操作可以直接集成到 shift 规范中,通过使用 # 语法将常量值映射到目标路径。
优化后的 JOLT 转换规范
以下是经过优化和修正的JOLT规范,它将实现期望的输出结构:
[
{
"operation": "shift",
"spec": {
"AssetID": "data[0].6.value",
"AssetNumber": "data[0].7.value",
"AssetMaterial": "data[0].8.value",
"AssetName": "data[0].9.value",
"CustRID": "data[0].10.value",
"SerialNumber": "data[0].11.value",
"Room": "data[0].12.value",
"Datacenter": "data[0].13.value",
"UMountingID": "data[0].14.value",
"CabinetAssetID": "data[0].15.value",
"CabinetName": "data[0].16.value",
// 将常量值 "table1" 映射到目标路径 "to"
"#table1": "to"
}
},
{
"operation": "default",
"spec": {
// 添加 fieldsToReturn 数组
"fieldsToReturn": [6, 7, 8, 9, 10, 11, 12]
}
},
{
"operation": "sort" // 可选操作,用于确保输出对象的键有序
}
]规范说明:
-
shift 操作:
- "AssetID": "data[0].6.value": 这里的关键是 data[0]。它指示JOLT将 AssetID 的值放置到 data 数组的第一个元素(索引为0)内部,并以 6.value 作为其路径。所有其他字段也同样使用 data[0],确保它们都被写入同一个对象。
- "#table1": "to": 这是一个将常量值添加到输出的简洁方法。#table1 表示源数据中没有名为 table1 的字段,因此 JOLT 会将字符串 "table1" 作为值,并将其映射到目标路径 to。这替代了原先的第一个 default 操作。
-
default 操作:
- 此操作用于添加在输入JSON中不存在的默认字段。在这里,它用于添加 fieldsToReturn 数组。
-
sort 操作 (可选):
- sort 操作会按照键的字母顺序对JSON对象进行排序。这对于确保输出的确定性和可读性非常有用,尤其是在调试或比较输出时。
最终输出验证
使用上述优化后的JOLT规范对输入JSON进行转换,将得到完全符合期望的输出:
{
"data": [
{
"6": { "value": "1" },
"7": { "value": "2" },
"8": { "value": "Cisco MDS 9706" },
"9": { "value": "Cisco-MDS-9706_1" },
"10": { "value": "A001" },
"11": { "value": "OU812" },
"12": { "value": "ROOM5" },
"13": { "value": "DC69" },
"14": { "value": "86" },
"15": { "value": "181" },
"16": { "value": "CAB666" }
}
],
"to": "table1",
"fieldsToReturn": [ 6, 7, 8, 9, 10, 11, 12 ]
}可以看到,所有资产字段都已成功合并到 data 数组的单个对象中,并且 to 和 fieldsToReturn 字段也已正确添加。
总结与注意事项
- 共同索引的关键作用: 当需要将多个源字段合并到目标数组的同一个对象中时,务必在 shift 规范中使用一个共同的数组索引(如 [0])。
- 优化 default 操作: 对于添加常量值,可以直接在 shift 规范中使用 #value: "targetPath" 的语法,以减少JOLT规范的阶段数量,提高效率。
- JOLT的灵活性: JOLT提供了强大的数据转换能力,但理解其操作符(特别是 [] 和 [index])的行为对于实现复杂的结构重塑至关重要。
- 调试技巧: 在构建复杂的JOLT规范时,逐步测试每个操作阶段的输出,可以帮助定位问题并理解转换过程。
以上就是JOLT JSON转换:将数组中的多个独立对象合并为单个对象的详细内容,更多请关注其它相关文章!
# 可选
# 长沙网站建设电商
# 学习优化网站关键词
# 吉安县seo品牌
# 丽水网站推广蔚芯hfqjwl下拉
# 黄冈seo关键词优化排名公司
# 棒球大联盟营销推广模式
# 文登信息港威海网站建设
# 阿里云网站建设案例分析
# 徐州虚拟网站建设市价
# 抖音seo福建
# 包含了
# js
# 可以直接
# 如何使用
# 并到
# 如何用
# 第一个
# 并为
# 组中
# 多个
# json数组
# json
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台
c++ dfs和bfs代码 c++深度广度优先搜索算法
J*aScript中高效清空DOM列表元素:解决for循环中断与任务管理问题
迅雷下载到U盘速度很慢怎么办_迅雷U盘下载慢优化方法
单射、满射与双射的关系 一文理清所有逻辑
Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南
Go RPC HTTP服务正确实现与常见陷阱解析
sublime怎么格式化代码_sublime代码美化与一键排版插件配置
漫蛙2正版漫画站 漫蛙2网页版快速访问入口
美团外卖商家服务中心入口 美团商家版官网入口
C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程
如何在J*a中实现统一对象行为接口_项目大型化时的接口规范化
微信网页版扫码登录入口 微信网页版二维码登录入口
TypeScript/J*aScript:高效查找数组中首个唯一ID对象
Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口
CSS Box Model与弹性按钮:维持布局稳定的动画实践
Vue.js 图片显示异常排查:理解应用挂载范围与DOM ID唯一性
双系统安装时,如何设置默认启动系统? msconfig命令了解一下!
Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全
c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架
如何提高微信支付的安全性_微信支付安全防护与设置建议
初次安装JDK时环境变量如何正确配置_J*A_HOME与PATH设置规则讲解
Log4j Console Appender性能瓶颈与高并发优化策略
Eclipse怎么运行工程_Eclipse工程运行配置说明
汽水音乐在线版入口_汽水音乐网页播放手册
Golang如何实现Web文件静态资源服务器_Golang静态资源服务器开发与实践
Shopware订单对象中获取产品自定义字段的正确方法
知音漫客正版漫画平台_知音漫客官网账号登录
腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址
Adobe PDF表单中利用J*aScript解析与格式化日期组件的教程
vivo浏览器怎么扫描二维码 vivo浏览器内置扫一扫功能使用方法
免费抖音短视频入口_抖音网页版短视频免费通道
Python大型XML文件高效流式解析教程
深入理解Promise链:如何在catch后中断then的执行
谷歌浏览器无痕模式怎么开 Chrome开启无痕浏览设置方法【教程】
Win11怎么开启卓越性能模式 Win11电源选项启用高性能释放硬件潜力【方法】
Node.js 中使用 node-cron 实现定时 API 数据抓取与处理
Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略
TikTok国际版官网直达_TikTok国际版官网直达进入在线观看
现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践
“音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!
在Qt QML中通过Python字典动态更新TextEdit内容的教程
一加Ace 6T实拍样张首次公布!李杰:主摄实力完全看齐4K档性能旗舰
qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程
Win11怎么用U盘重装系统 Win11制作启动盘并重装系统完整教程【详解】
PDF文件体积过大处理_PDF压缩技巧详解
mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析
React Router v6 教程:构建认证保护的私有路由与重定向策略
将HTML动态表格多行数据保存到Google Sheet的教程
Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】


2025-12-05
浏览次数:次
返回列表
ot;,
"CabinetName": "data[].16.value"
}
}
]