新闻中心
JOLT 转换中数组对象合并与结构优化指南

本教程详细阐述了如何在使用 jolt 进行 json 转换时,解决将多个独立对象合并为一个数组内单一对象的常见问题。通过调整 jolt shift 操作中的数组索引策略,即从动态索引 [] 改为固定索引 [0],可以有效消除冗余的 {} 结构。文章还提供了优化 jolt 规范的技巧,包括将 default 操作整合到 shift 阶段,以构建更高效、更符合预期的 json 输出。
JOLT 数组对象合并与结构优化
在使用 JOLT 进行 JSON 数据转换时,经常会遇到需要将源数据中的多个字段映射到目标 JSON 结构中一个数组内的单一对象。然而,如果处理不当,JOLT 可能会为数组中的每个字段创建独立的子对象,导致输出结构与预期不符。本文将详细介绍如何通过精确控制 JOLT shift 操作中的数组索引来解决这一问题,并提供优化 JOLT 规范的实践建议。
问题场景与输入/输出示例
假设我们有一个扁平的输入 JSON 对象,需要将其中的一部分字段转换为目标 JSON 结构中 data 数组内的一个单一对象,每个字段对应一个带 value 键的嵌套结构。
输入 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"
}期望输出 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[].
导致问题的 JOLT Spec 示例:
[
{
"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",
"CabinetName": "data[].16.value"
}
},
{
"operation": "default",
"spec": {
"to": "table1"
}
},
{
"operation": "default",
"spec": {
"fieldsToReturn": [6, 7, 8, 9, 10, 11, 12]
}
}
]上述 Spec 产生的输出 JSON (带有冗余 {}):
{
"data": [
{
"6": {
"value": "1"
}
},
{
"7": {
"value": "2"
}
},
{
"8": {
"value": "Cisco MDS 9706"
}
},
// ... 更多独立的子对象 ...
{
"16": {
"value": "CAB666"
}
}
],
"to": "table1",
"fieldsToReturn": [ 6, 7, 8, 9, 10, 11, 12 ]
}可以看到,data 数组中包含了多个独立的 {} 对象,每个对象只包含一个键值对,这与我们的期望不符。
Writer
企业级AI内容创作工具
220
查看详情
解决方案:使用固定数组索引
解决此问题的关键在于,在 shift 操作中,为所有需要合并到同一数组元素的字段指定一个固定的数组索引,而不是使用 [] 动态生成新索引。例如,使用 data[0] 将所有字段都映射到 data 数组的第一个元素中。
优化后的 JOLT Spec:
[
{
"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",
// 将 "to" 字段直接整合到 shift 阶段
"#table1": "to"
}
},
{
"operation": "default",
"spec": {
"fieldsToReturn": [6, 7, 8, 9, 10, 11, 12]
}
},
{
"operation": "sort"
}
]解释:
- 通过将所有目标路径中的 data[] 替换为 data[0],JOLT 会将所有匹配的输入字段值都写入 data 数组的第一个元素中。由于它们都指向同一个目标对象,因此会自然地合并为一个对象。
- "#table1": "to" 是一种 JOLT 的语法糖,它表示将字符串字面量 "table1" 作为值,映射到目标路径 to。这种方式比单独使用一个 default 操作来添加静态值更为简洁和高效。
进一步优化与注意事项
-
整合 default 操作: 原始的 default 操作用于添加 "to": "table1" 可以直接整合到 shift 阶段,如上述优化后的 Spec 所示,使用 "#
": " " 语法。 - sort 操作: sort 操作可以确保输出 JSON 对象的键值对按照字母顺序排列,这在某些场景下有助于保持输出的一致性,但并非强制要求。
- fieldsToReturn 的处理: fieldsToReturn 数组的添加仍然需要一个 default 操作,因为它是一个静态数组,不依赖于输入字段的转换。将其放在 shift 之后是合理的。
最终的 JOLT Spec 和输出
结合上述优化,最终推荐的 JOLT Spec 如下:
[
{
"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": [6, 7, 8, 9, 10, 11, 12] // 添加静态数组
}
},
{
"operation": "sort" // 可选:对输出对象进行排序
}
]使用此 Spec 进行转换,将得到完全符合期望的输出:
{
"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 ]
}总结
通过本教程,我们学习了在 JOLT shift 操作中,如何通过使用固定的数组索引(如 data[0])而非动态索引(data[]),来有效地将多个输入字段合并到目标数组中的单一对象。这种方法避免了生成冗余的 {} 结构,使输出 JSON 更符合预期。同时,我们还探讨了将静态值添加操作整合到 shift 阶段,以及使用 sort 操作进行输出优化的技巧,从而编写出更简洁、高效的 JOLT 转换规范。理解 JOLT 中数组索引的工作原理是实现复杂 JSON 结构转换的关键。
以上就是JOLT 转换中数组对象合并与结构优化指南的详细内容,更多请关注其它相关文章!
# 并到
# 最新产品推广营销模式
# 漳州网站建设原创
# 优化网站联系电话
# 江西电商网站推广销售
# 西安美食营销推广招聘
# 面试网络营销推广专员
# 专注seo排名
# 岳阳建设商城网站公司
# 长安区营销推广招聘信息
# 济南网站建设框架制作
# 如何使用
# 并为
# js
# 第一个
# 结构优化
# 组中
# 键值
# 如何用
# 并与
# 多个
# 排列
# 键值对
# 常见问题
# json
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
如何提高微信支付的安全性_微信支付安全防护与设置建议
TikTok网页版直接登录 TikTok网页端官方平台入口
凉拌黄瓜怎么拌更入味 凉拌黄瓜简单家常做法
QQ邮箱网页版快速登录 QQ邮箱邮箱账号官方入口地址
优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法
Win10如何清理注册表垃圾 Win10手动清理无效注册表【技巧】
J*aScript中赋值与自增运算符的复杂交互与执行机制
2026年CSGO开箱网站推荐 CSGO开箱平台精选
在Go Martini框架中高效服务动态生成图像的实践指南
快手网页版在线登录 快手网页版官网入口快速访问
正确连接J*aScript到HTML实现可点击图片与自定义事件处理
快手官方唯一登录入口 谨防山寨钓鱼网站
Android Studio计算器C键功能异常排查与修复教程
百度网盘网页版入口 百度网盘网页版官方登录网址
Odoo 16:在表单视图中基于当前记录动态修改Tree视图属性
wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法
快手赚钱渠道_快手收益来源
汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口
12306选座系统怎么选连座_12306选座多人连坐操作方法
QQ邮箱官方网页版登录 QQ邮箱个人邮箱快速访问
c++如何使用TBB库进行任务并行_c++ Intel线程构建模块
解决Flask中Quill编辑器内容提交失败及TypeError的指南
如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension
天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南
护手霜蹭到袖口上了如何清洗? 怎样避免留下一圈油印?
Lar*el DB::listen 事件中的查询执行时间单位解析
Yandex免登录官网入口_俄罗斯Yandex搜索引擎直达链接
夸克浏览器桌面版同步不了书签怎么处理 夸克浏览器跨设备同步异常解决方案
C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责
J*aScript实现单选按钮与关联输入框的联动禁用教程
微信语音通话掉线如何解决 微信语音通话稳定优化方法
Go语言中动态执行代码字符串的策略与实践
优化大型XML文件解析:基于Python流式处理的内存高效方案
邮政编码查询不到怎么办_邮政编码查询不到的常见原因与对策
微信客户端如何收红包_微信客户端接收红包使用教程
QQ邮箱稳定登录入口_QQ邮箱官方网站网页版使用
J*a TimerTask中HashMap意外清空的深层原因与解决方案
J*aScript中高效管理与清空动态列表:避免循环陷阱
大象笔记网页版入口 印象笔记网页版登录入口
QQ邮箱网页版入口 QQ邮箱官方邮箱登录通道
蛙漫画网页版全站入口 蛙漫热门作品免费浏览
C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程
Node.js 中使用 node-cron 实现定时 API 数据抓取与处理
J*a里如何使用forEach遍历Map_Map遍历方法说明
离线运行Go语言之旅:本地部署与GOPATH配置指南
支付宝如何设置安全保护_支付宝安全设置的全面教程
苹果手机指南针不准怎么校准 传感器校准方法详解【建议收藏】
b站赚钱渠道_b站收益来源
Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略
邮政快递包裹最新位置 邮政快递实时追踪入口


2025-12-05
浏览次数:次
返回列表
{
"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 ]
}