Jolt数据转换:JSON数值求和与结构重塑技巧
本文详细介绍了如何利用Jolt进行JSON数据转换,实现嵌套对象中数值的求和,并将结果作为新字段添加到原始数据中,同时保留原始结构,适用于复杂JSON数据聚合与转换的场景。通过分步解析Jolt转换规范(Spec),展示了如何利用shift操作进行数据提取与重塑,以及modify-overwrite-beta操作执行数学计算。文章以一个具体的例子,详细讲解如何利用Jolt实现对JSON对象内部所有数值的求和,并将求和结果作为一个新字段添加到原始数据中。掌握Jolt的shift和modify-overwrite-beta操作,有助于处理更复杂的数据转换需求,使JSON数据处理变得更加灵活和高效,极大地提升您在数据集成和转换项目中的工作效率。
在数据处理领域,经常会遇到需要对JSON结构中的特定数值进行聚合计算,并将其结果整合到输出数据中的场景。Jolt作为一款强大的JSON转换工具,能够通过一系列声明式的转换操作(Spec)高效地完成这类任务。本文将以一个具体的例子,详细讲解如何利用Jolt实现对JSON对象内部所有数值的求和,并将求和结果作为一个新字段添加到原始数据中。
场景描述
假设我们有如下输入JSON数据,其中accounts对象包含多个账户及其对应的数值:
输入JSON:
{ "accounts": { "canara": 1, "sbi": 0, "axis": 1, "hdfc": 0 } }
我们的目标是计算accounts对象中所有数值(1, 0, 1, 0)的总和,并将结果2添加为一个名为"total accounts"的新字段,同时保留原始的账户信息,最终输出结构如下:
期望输出JSON:
{ "canara": 1, "sbi": 0, "axis": 1, "hdfc": 0, "total accounts": 2 }
Jolt转换规范解析
为了实现上述转换,我们需要构建一个包含多个操作的Jolt Spec。这个过程可以分为三个主要阶段:数据提取与暂存、数值计算与新字段生成、结构重塑与清理。
阶段一:数据提取与暂存
首先,我们需要将accounts对象中的所有值提取出来,以便后续进行求和。同时,为了在最终输出中保留原始的账户信息,我们也需要将其暂存。
[ { "operation": "shift", "spec": { "accounts": { "*": { "@": "&", "@": "accountsAccumulator[]" } } } }, { // ... 后续操作 } ]
操作详解:
- "operation": "shift":这是一个核心操作,用于重塑JSON结构。
- "accounts": {...}:匹配输入JSON中的accounts字段。
- "*": {...}:匹配accounts对象下的所有键(例如canara、sbi等)。
- "@": "&":这是关键。@代表当前匹配到的值(例如1、0)。&代表当前匹配到的键(例如canara、sbi)。这个规则的含义是将原始的键值对(如"canara": 1)直接提升到输出的根层级。
- "@": "accountsAccumulator[]":这会将当前匹配到的值(如1、0)收集到一个名为accountsAccumulator的数组中。[]表示这是一个数组,每次匹配都会向其中添加一个元素。
经过此阶段,中间输出可能类似:
{ "canara": 1, "sbi": 0, "axis": 1, "hdfc": 0, "accountsAccumulator": [1, 0, 1, 0] }
阶段二:数值计算与新字段生成
接下来,我们利用modify-overwrite-beta操作对暂存的数值数组进行求和,并将结果赋值给新的字段。
[ { "operation": "shift", "spec": { "accounts": { "*": { "@": "&", "@": "accountsAccumulator[]" } } } }, { "operation": "modify-overwrite-beta", "spec": { "total accounts": "=intSum(@(1,accountsAccumulator))" } }, { // ... 后续操作 } ]
操作详解:
- "operation": "modify-overwrite-beta":这个操作允许我们对现有数据进行修改或创建新字段,并支持数学函数。
- "total accounts": "=intSum(@(1,accountsAccumulator))":
- "total accounts":定义了要创建的新字段的名称。
- =intSum(...):调用Jolt内置的intSum函数进行整数求和。
- @(1,accountsAccumulator):这是一个路径表达式。@表示引用数据,1表示向上回溯一级(即从当前modify操作的输入中查找),accountsAccumulator是我们要求和的数组的名称。这意味着它会获取上一阶段生成的accountsAccumulator数组并对其进行求和。
经过此阶段,中间输出可能类似:
{ "canara": 1, "sbi": 0, "axis": 1, "hdfc": 0, "accountsAccumulator": [1, 0, 1, 0], "total accounts": 2 }
阶段三:结构重塑与清理
最后一步是清理临时字段accountsAccumulator,确保输出只包含我们期望的数据。
[ { "operation": "shift", "spec": { "accounts": { "*": { "@": "&", "@": "accountsAccumulator[]" } } } }, { "operation": "modify-overwrite-beta", "spec": { "total accounts": "=intSum(@(1,accountsAccumulator))" } }, { "operation": "shift", "spec": { "accountsAccumulator": null, "*": "&" } } ]
操作详解:
- "operation": "shift":再次使用shift操作进行最终的结构调整。
- "accountsAccumulator": null:这会将accountsAccumulator字段从输出中移除。
- "*": "&":这个通配符规则将所有其他根级别的字段(如canara、sbi、total accounts)保留并提升到输出的根层级。
完整的Jolt Spec
将以上三个阶段的Spec组合起来,就得到了最终的Jolt转换规范:
[ { "operation": "shift", "spec": { "accounts": { "*": { "@": "&", "@": "accountsAccumulator[]" } } } }, { "operation": "modify-overwrite-beta", "spec": { "total accounts": "=intSum(@(1,accountsAccumulator))" } }, { "operation": "shift", "spec": { "accountsAccumulator": null, "*": "&" } } ]
示例与效果
使用上述Jolt Spec对以下输入JSON进行转换:
输入:
{ "accounts": { "canara": 1, "sbi": 0, "axis": 1, "hdfc": 0 } }
将得到期望的输出:
输出:
{ "canara": 1, "sbi": 0, "axis": 1, "hdfc": 0, "total accounts": 2 }
注意事项
- 数据类型: intSum函数用于整数求和。如果您的数值可能包含小数,应使用doubleSum函数。
- 临时字段: 在Jolt转换中,创建临时字段(如本例中的accountsAccumulator)是实现复杂逻辑的常见模式。在转换的最后阶段,务必清理这些临时字段以保持输出的整洁。
- 路径表达式: @(1,accountsAccumulator)中的@(1,...)表示从当前节点向上回溯一级查找指定的字段。理解Jolt的路径表达式对于编写复杂的Spec至关重要。
- 健壮性: 本例假设accounts下的值都是数字。如果存在非数字值,intSum或doubleSum可能会忽略它们或导致错误,具体行为取决于Jolt版本和配置。在生产环境中,可能需要额外的步骤来验证或清洗数据。
总结
通过本教程,我们学习了如何利用Jolt的shift和modify-overwrite-beta操作,实现对JSON对象内部数值的求和,并将结果整合到新的字段中,同时保持原始数据的完整性。这种分阶段、模块化的Jolt Spec设计方法,有助于处理更复杂的数据转换需求,使JSON数据处理变得更加灵活和高效。掌握这些基本模式,将极大地提升您在数据集成和转换项目中的工作效率。
以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于文章的相关知识,也可关注golang学习网公众号。

- 上一篇
- CSS修复iOS滚动卡顿:-webkit-overflow-scrolling技巧

- 下一篇
- JS取数组最后n个元素的几种方法
-
- 文章 · java教程 | 2分钟前 |
- HBase大数据存储Java操作全解析
- 241浏览 收藏
-
- 文章 · java教程 | 12分钟前 |
- Java大文件处理:NIO高效读写方法
- 492浏览 收藏
-
- 文章 · java教程 | 16分钟前 |
- Java线程池类型与使用场景解析
- 424浏览 收藏
-
- 文章 · java教程 | 41分钟前 |
- Java操作Kafka:生产者消费者实战教程
- 392浏览 收藏
-
- 文章 · java教程 | 44分钟前 |
- Java操作JSON,org.json库入门指南
- 426浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- Java装饰器模式详解与应用实例
- 410浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- HC-05蓝牙模块Android数据传输教程
- 168浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- SpringBoot多数据源JPA配置教程
- 149浏览 收藏
-
- 文章 · java教程 | 2小时前 |
- JHipsterOneToMany关系生成与报错解决
- 485浏览 收藏
-
- 文章 · java教程 | 2小时前 |
- Java实现YOLO目标检测分拣方案
- 235浏览 收藏
-
- 文章 · java教程 | 2小时前 |
- Java集成百度语音SDK实现语音识别教程
- 180浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 千音漫语
- 千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
- 200次使用
-
- MiniWork
- MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
- 202次使用
-
- NoCode
- NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
- 198次使用
-
- 达医智影
- 达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
- 206次使用
-
- 智慧芽Eureka
- 智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
- 221次使用
-
- 提升Java功能开发效率的有力工具:微服务架构
- 2023-10-06 501浏览
-
- 掌握Java海康SDK二次开发的必备技巧
- 2023-10-01 501浏览
-
- 如何使用java实现桶排序算法
- 2023-10-03 501浏览
-
- Java开发实战经验:如何优化开发逻辑
- 2023-10-31 501浏览
-
- 如何使用Java中的Math.max()方法比较两个数的大小?
- 2023-11-18 501浏览