Jolt 数据转换:如何对 JSON 对象中的数值进行求和并添加新字段

jolt 数据转换:如何对 json 对象中的数值进行求和并添加新字段

本教程详细介绍了如何使用 Jolt 对 JSON 对象中的数值进行求和,并将结果添加为一个新的字段。文章通过分步解析 Jolt 转换规范,演示了如何利用 shift 操作重塑数据结构,并结合 modify-overwrite-beta 操作中的 intSum 函数实现数值累加,最终得到所需的数据输出。

问题描述

在处理 JSON 数据时,我们经常需要对某个对象中的所有数值进行汇总,并将汇总结果作为新的字段添加到输出中。例如,给定以下输入 JSON:

{  "accounts": {    "canara": 1,    "sbi": 0,    "axis": 1,    "hdfc": 0  }}

我们的目标是计算 accounts 对象中所有账户的数值之和(即 1 + 0 + 1 + 0 = 2),并将结果以 “total accounts”: 2 的形式添加到输出中,同时保留原始的账户信息。期望的输出如下:

{  "canara": 1,  "sbi": 0,  "axis": 1,  "hdfc": 0,  "total accounts": 2}

接下来,我们将详细介绍如何使用 Jolt 来实现这一转换。

Jolt 转换实现

为了实现上述目标,我们需要设计一个包含三个操作步骤的 Jolt 转换规范:

步骤一:数据准备与扁平化 (shift 操作)

第一个 shift 操作的目的是将 accounts 对象中的所有键值对提升到根级别,并同时将所有账户的数值收集到一个临时数组中,以便后续进行求和。

{  "operation": "shift",  "spec": {    "accounts": {      "*": [        ".&",        "accountsAccumulator"      ]    }  }}

解析:

“accounts”:匹配输入 JSON 中的 accounts 字段。”*”:匹配 accounts 对象下的所有键(如 canara, sbi 等)。[“.&”, “accountsAccumulator”]:这是一个数组,表示对每个匹配到的键值对执行两种映射:”.&”:将当前匹配到的值(例如 1)映射到当前匹配到的键名(例如 canara)。这会将 {“canara”: 1}、{“sbi”: 0} 等直接提升到输出的根级别。”accountsAccumulator”:将当前匹配到的值(例如 1)收集到一个名为 accountsAccumulator 的数组中。由于 Jolt 默认会将相同路径的多次映射聚合为数组,所以最终 accountsAccumulator 将包含 [1, 0, 1, 0]。

经过此步骤后,中间输出将类似于:

{  "canara": 1,  "sbi": 0,  "axis": 1,  "hdfc": 0,  "accountsAccumulator": [1, 0, 1, 0]}

步骤二:执行求和计算 (modify-overwrite-beta 操作)

第二个操作是 modify-overwrite-beta,它用于执行数据计算和修改。我们将利用其内置的 intSum 函数来计算 accountsAccumulator 数组的总和。

怪兽AI数字人 怪兽AI数字人

数字人短视频创作,数字人直播,实时驱动数字人

怪兽AI数字人 44 查看详情 怪兽AI数字人

{  "operation": "modify-overwrite-beta",  "spec": {    "total accounts": "=intSum(@(1,accountsAccumulator))"  }}

解析:

“total accounts”:指定要创建的新字段名称。”=intSum(@(1,accountsAccumulator))”:=:表示这是一个函数调用。intSum(…):Jolt 内置的整数求和函数。@(1,accountsAccumulator):这是一个相对路径表达式。@:表示引用当前操作输入中的值。1:表示向上回溯一级(从当前 modify 操作的上下文,即根级别)。accountsAccumulator:指定要引用的字段名。因此,@(1,accountsAccumulator) 引用的是上一步生成的 accountsAccumulator 数组 [1, 0, 1, 0]。intSum 函数将对这个数组进行求和,结果为 2。

经过此步骤后,中间输出将变为:

{  "canara": 1,  "sbi": 0,  "axis": 1,  "hdfc": 0,  "accountsAccumulator": [1, 0, 1, 0],  "total accounts": 2}

步骤三:结果整理与输出 (shift 操作)

最后一个 shift 操作的目的是清理临时字段 accountsAccumulator,并确保最终输出的结构符合要求。

{  "operation": "shift",  "spec": {    "accountsAccumulator": null,    "*": "&"  }}

解析:

“accountsAccumulator”: null:将 accountsAccumulator 字段映射到 null,这在 shift 操作中等同于删除该字段,因为它不会被映射到输出中。”*”: “&”:这是一个通配符映射。它表示将输入中所有其他字段(除了已经被显式处理的 accountsAccumulator)按原样复制到输出中。& 表示将当前匹配到的键名作为输出的键名,其对应的值作为输出的值。这确保了 canara、sbi、axis、hdfc 和 total accounts 等字段被保留并输出。

最终,我们将得到预期的输出:

{  "canara": 1,  "sbi": 0,  "axis": 1,  "hdfc": 0,  "total accounts": 2}

完整 Jolt 转换规范

将上述三个操作合并,完整的 Jolt 转换规范如下:

[  {    "operation": "shift",    "spec": {      "accounts": {        "*": [          ".&",          "accountsAccumulator"        ]      }    }  },  {    "operation": "modify-overwrite-beta",    "spec": {      "total accounts": "=intSum(@(1,accountsAccumulator))"    }  },  {    "operation": "shift",    "spec": {      "accountsAccumulator": null,      "*": "&"    }  }]

核心概念与注意事项

多阶段转换链: 复杂的 Jolt 转换通常需要通过链式组合多个操作来完成。每个操作的输出作为下一个操作的输入,逐步实现数据转换目标。本例中,shift 用于重塑和准备数据,modify-overwrite-beta 用于计算,最后的 shift 用于清理和最终结构化。shift 操作的灵活性:& 和 .:在 shift 操作中,& 代表当前匹配的键名,. 代表当前匹配的值。它们是构建输出路径和值的重要工具。数组输出:当多个输入路径映射到相同的输出路径时,Jolt 会自动将这些值聚合为一个 JSON 数组。这在收集数据(如本例中的 accountsAccumulator)时非常有用。modify-overwrite-beta 与数学函数:modify-overwrite-beta 操作是 Jolt 中执行数据计算和修改的核心。它支持多种内置函数,包括数学函数(如 intSum、doubleSum、min、max、abs 等)、字符串函数、逻辑函数等。=functionName(…):这是在 modify 操作中调用 Jolt 函数的语法。@(level, fieldName):这种语法允许您在 modify 操作中引用输入 JSON 中的特定字段,即使该字段不在当前处理的上下文中。level 指示向上回溯的层级。

总结

通过本教程,我们学习了如何使用 Jolt 的 shift 和 modify-overwrite-beta 操作来对 JSON 对象中的数值进行求和,并将结果作为一个新字段添加。这种多阶段的转换方法在 Jolt 中非常常见,能够帮助我们灵活地处理各种复杂的数据转换需求。理解每个操作的职责以及 Jolt 路径表达式和内置函数的使用是掌握 Jolt 转换的关键。

以上就是Jolt 数据转换:如何对 JSON 对象中的数值进行求和并添加新字段的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/236245.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月3日 23:29:35
下一篇 2025年11月3日 23:30:50

相关推荐

发表回复

登录后才能评论
关注微信