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

JOLT转换:将数组中的独立对象合并为单一对象
在处理JSON数据转换时,JOLT是一个功能强大的工具,尤其适用于Nifi等数据流处理场景。本教程将深入探讨一个常见的JOLT转换需求:如何将一个扁平化的JSON输入结构,转换成一个包含单一复杂对象的数组。具体来说,我们将解决如何避免JOLT默认行为产生的“数组中每个键值对都独立成一个对象”的问题,转而将所有键值对聚合到数组的第一个(也是唯一一个)对象中。
理解问题与目标
假设我们有一个扁平化的输入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"
}我们希望将其转换成一个更结构化的输出,其中所有资产属性都嵌套在一个名为 data 的数组中,并且 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的默认行为会将每个 key.value 对都生成为一个独立的子对象,并将其添加到 data 数组中,导致输出结构与期望不符。
常见错误输出 JSON 示例 (每个键值对一个独立对象):
j2me3D游戏开发简单教程 中文WORD版
本文档主要讲述的是j2me3D游戏开发简单教程; 如今,3D图形几乎是任何一部游戏的关键部分,甚至一些应用程序也通过用3D形式来描述信息而获得了成功。如前文中所述,以立即模式和手工编码建立所有的3D对象的方式进行开发速度很慢且很复杂。应用程序中多边形的所有角点必须在数组中独立编码。在JSR 184中,这称为立即模式。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
0
查看详情
{
"data": [
{ "6": { "value": "1" } },
{ "7": { "value": "2" } },
// ... 更多独立对象 ...
{ "16": { "value": "CAB666" } }
],
"to": "table1",
"fieldsToReturn": [ 6, 7, 8, 9, 10, 11, 12 ]
}JOLT shift 操作实现对象聚合
要解决上述问题,关键在于利用JOLT shift 操作的路径表达式,将所有转换后的键值对显式地指向数组的同一个索引位置。最直接的方法是使用 data[0]. 来确保所有数据都汇聚到 data 数组的第一个元素中。
以下是实现期望输出的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"
}
},
{
"operation": "default",
"spec": {
"fieldsToReturn": [6, 7, 8, 9, 10, 11, 12]
}
},
{
"operation": "sort"
}
]规范详解
-
shift 操作的核心:data[0].
- "AssetID": "data[0].6.value":这是实现目标的关键。
- data:指定输出中将包含一个名为 data 的数组。
- [0]:这是最重要的部分。它指示JOLT将所有匹配到的值都放入 data 数组的 第一个 元素(索引为0)中。如果没有 [0],JOLT会为每个匹配到的输入键创建一个新的数组元素。
- 6.value:在 data 数组的第一个元素内部,创建一个键为 6 的对象,该对象中再包含一个键为 value 的字段,其值为原始 AssetID 的值。其他的 AssetNumber 等字段也以此类推。
- "#table1": "to":这是一个将静态值添加到输出根目录的技巧。# 符号表示将字符串字面量作为值,并将其映射到 to 键。这比单独使用 default 操作来添加静态值更高效,因为可以在同一个 shift 阶段完成。
- "AssetID": "data[0].6.value":这是实现目标的关键。
-
default 操作
- "operation": "default":此操作用于在输出中添加默认值或缺失的字段。
- "spec": { "fieldsToReturn": [6, 7, 8, 9, 10, 11, 12] }:在这里,它用于在输出的根目录添加一个名为 fieldsToReturn 的数组,其中包含指定的数字。这是一个独立的默认值,与 data 数组的转换是并行的。
-
sort 操作 (可选)
- "operation": "sort":此操作用于对输出JSON中的键进行字母排序。它通常用于确保输出的一致性,但对于功能实现本身并非必需。
优化与注意事项
- 合并静态值到 shift 阶段: 如上述规范所示,将 "#table1": "to" 放在 shift 操作中,可以避免额外的 default 操作,使JOLT规范更简洁高效。
-
理解 [] 与 [0] 的区别:
- data[]:JOLT会为每个匹配到的输入路径创建一个新的数组元素。例如,如果输入有10个 AssetID,data[] 会生成一个包含10个元素的数组。
- data[0]:JOLT会将所有匹配到的输入路径的值都聚合到 data 数组的第一个(索引为0)元素中。
- JOLT路径表达式的灵活性: JOLT允许使用通配符 (*) 和捕获组 ($1, $2 等) 来处理更复杂的动态结构。本例中,由于输入键是固定的,直接映射是最清晰的方法。
- 调试JOLT规范: 在开发JOLT规范时,建议使用在线JOLT转换器或Nifi中的JoltTransformJSON处理器进行逐步测试,观察每一步操作的输出,以便更好地理解和调试。
总结
通过本教程,我们学习了如何利用JOLT shift 操作中固定数组索引 data[0] 的强大功能,将扁平化JSON中的多个键值对有效地聚合到一个单一的数组对象中。这种技术在处理需要将多个属性合并为一个复杂实体的数据转换场景中非常实用。掌握 shift 操作的细微差别,特别是数组索引的使用,是编写高效且准确JOLT规范的关键。
以上就是JOLT转换:将数组中的独立对象合并为单一对象的详细内容,更多请关注其它相关文章!
# json
# 处理器
# 工具
# 区别
# js
# 盐城天竺神韵网站建设
# 网站建设服务文案
# 互联网有哪些推广网站
# 泰安网站建设机构有哪些
# 鱼台seo查询
# 邢台网站优化多少钱
# 餐饮推广渠道有哪些网站
# 苏州虎丘网站推广优化
# seo做什么网站赚钱多
# 正规网站建设套餐有哪些
# 这是一个
# 多个
# 创建一个
# 这是
# 如何用
# 游戏开发
# 并为
# 键值
# 组中
# 第一个
# 键值对
# json处理
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
如何在Python中使用Optional类型处理可变对象并避免Pylint警告
2025俄罗斯Yandex最新入口 官方网站地址及浏览器下载指南
AO3最新镜像入口 Archive of Our Own官方平台访问
PySpark中从现有列右侧提取可变长度字符创建新列的教程
b站赚钱渠道_b站收益来源
Tailwind CSS line-clamp 布局问题解析与修复指南
如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率
在Qt QML中通过Python字典动态更新TextEdit内容的教程
字由网在线版登录地址 字由网网页版安全入口
Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法
高德地图家和公司地址在哪设置 高德地图通勤路线设置方法【超详细】
sublime怎么格式化代码_sublime代码美化与一键排版插件配置
如何将HTML表格多行数据保存到Google Sheet
漫蛙2网页版漫画入口 漫蛙漫画在线官方登录
Windows10怎么开启夜间模式 Windows10系统设置调整色温与亮度缓解夜间用眼疲劳【教程】
Python:递归比较文件夹内容并找出特定类型文件的差异
taptap防沉迷怎么解除 taptap解除健康系统限制说明【2025最新】
Python中如何避免重复条件判断:利用数据结构实现动态逻辑
百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案
Golang如何使用new_Go new分配内存机制讲解
Lar*el 递归关系中排除指定分支的教程
如何在 Excel Online 和 Google 表格中更改日期格式
铁路12306的积分有效期是多久_铁路12306积分有效期说明
ArrayList与LinkedList核心操作的Big-O复杂度分析
Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】
必由学网页版入口 必由学官方平台直接访问
树莓派传感器触发:通过Twilio API发送WhatsApp消息教程
c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧
win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法
UE5.7引擎表现爆炸优化无敌!5090跑4K稳定60FPS
React列表渲染与独立状态管理:避免全局状态影响局部更新
Lar*el Excel导入时生成自定义递增ID的策略与实践
Android Studio计算器C键功能异常排查与修复教程
解决 Express.js 中 PUT 请求密码修改失败的路由配置指南
Composer中的^和~符号代表什么_精通Composer版本号语义化约束
深入理解J*a编译器的兼容性选项:从-source到--release
PyTorch模型训练准确率不提升:诊断与修复常见指标计算错误
在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明
HuggingFaceEmbeddings中向量嵌入维度调整的限制与理解
如何在J*a中使用Locale处理多语言环境
Win11文件资源管理器卡顿怎么修 Win11重置资源管理器进程优化响应速度【修复方法】
如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践
Excel组合图表怎么做 Excel创建柱状图与折线组合图教程【图表】
Gmail邮箱申请注册直达_Gmail邮箱免费注册PC版官网入口2025
12306选座怎么选到特殊座位_12306特殊座位选择注意事项
css卡片内容溢出如何处理_使用overflow隐藏或scroll显示内容
抖音网页版平台入口 抖音网页版官网在线访问教程
解决深度学习模型训练初期异常高损失与完美验证准确率问题
《北京人工智能产业白皮书(2025)》发布:全年核心产值预计突破 4500 亿元
steam官方入口大全 steam账号注册及操作指南


2025-12-05
浏览次数:次
返回列表