Jolt 数据转换:计算 JSON 对象中所有数值的总和

jolt 数据转换:计算 json 对象中所有数值的总和

Jolt 数据转换是一种强大的 JSON 结构重塑工具。本文将详细介绍如何使用 Jolt 的 shift 和 modify-overwrite-beta 操作,将 JSON 对象中特定字段的所有数值进行求和,并将结果添加为新的字段,同时保留原始数据结构,适用于需要聚合数值并扩展 JSON 结构的场景。

在处理 JSON 数据时,我们经常需要对特定字段的数值进行聚合计算,例如求和、平均值等。Jolt 提供了灵活的转换规则来应对这类需求。本文将以一个具体的例子,演示如何利用 Jolt 将一个 JSON 对象中所有子字段的数值进行求和,并将总和作为一个新字段添加到输出中。

场景描述与目标

假设我们有如下的输入 JSON 数据,其中 accounts 对象包含了多个账户及其对应的数值:

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

我们的目标是计算 accounts 对象中所有数值(1, 0, 1, 0)的总和,并将这个总和作为名为 “total accounts” 的新字段添加到 JSON 的根级别,同时保留原始的账户信息。期望的输出如下:

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

Jolt 转换规则详解

为了实现上述目标,我们将构建一个包含三个操作步骤的 Jolt 规范。这三个步骤协同工作,分别负责数据的提取、计算和最终的结构整理。

步骤一:提取并收集数值

首先,我们需要将 accounts 对象中的所有键值对提升到根级别,并同时将所有的数值收集到一个临时的数组中,以便后续进行求和。

Jolt 规范片段:

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

解释:

即构数智人 即构数智人

即构数智人是由即构科技推出的AI虚拟数字人视频创作平台,支持数字人形象定制、短视频创作、数字人直播等。

即构数智人 36 查看详情 即构数智人 “operation”: “shift”:这是一个 shift 操作,用于重塑 JSON 结构。”accounts”: { … }:匹配输入 JSON 中的 accounts 字段。”*”: [“.&”, “accountsAccumulator”]:这是核心的映射规则。”*”:匹配 accounts 对象下的所有键(例如 “canara”, “sbi”)。”.&”:将匹配到的值(例如 1)映射到其原始键(例如 “canara”)在输出的根级别。这意味着 {“canara”: 1} 会被提升为 {“canara”: 1}。”accountsAccumulator”:同时,将匹配到的值(例如 1)收集到一个名为 accountsAccumulator 的数组中。由于 accountsAccumulator 没有指定键,Jolt 会自动将其作为数组处理,每次匹配到的值都会被追加到这个数组中。

经过此步骤后的中间结果:

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

步骤二:计算总和

接下来,我们将使用 modify-overwrite-beta 操作来计算 accountsAccumulator 数组中所有数值的总和,并将结果赋值给一个新的字段 “total accounts”。

Jolt 规范片段:

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

解释:

“operation”: “modify-overwrite-beta”:这是一个 modify 操作的变体,用于在现有数据上进行计算并可能覆盖现有值。”total accounts”: “=intSum(@(1,accountsAccumulator))”:”total accounts”:定义了要创建或修改的新字段名。”=intSum(…)”:调用 Jolt 内置的 intSum 函数来计算整数和。@(1,accountsAccumulator):这是一个 Jolt 的引用路径表达式。@ 表示引用当前上下文的数据。(1,accountsAccumulator) 表示从当前层级向上回溯一层(即根级别),查找名为 accountsAccumulator 的字段。这将引用到上一步生成的 [1, 0, 1, 0] 数组。

经过此步骤后的中间结果:

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

步骤三:清理与整理

最后一步是清理掉在转换过程中创建的临时字段 accountsAccumulator,并确保所有其他字段都保留在最终输出中。

Jolt 规范片段:

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

解释:

“operation”: “shift”:再次使用 shift 操作进行结构整理。”accountsAccumulator”: null:将 accountsAccumulator 字段映射到 null,这在 shift 操作中意味着该字段将被移除。”*”: “&”:这是一个通配符规则,表示将所有其他字段(即 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,      "*": "&"    }  }]

使用示例

输入 JSON:

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

Jolt 规范:

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

输出 JSON:

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

注意事项与总结

操作顺序至关重要:Jolt 规范中的操作是按顺序执行的。本例中,必须先使用第一个 shift 收集数据,然后 modify-overwrite-beta 才能计算,最后再用第二个 shift 清理。数学函数选择:Jolt 的 modify 操作提供了多种数学函数,如 intSum (整数求和), doubleSum (浮点数求和), intMax (最大整数), doubleMin (最小浮点数) 等。根据数据类型选择合适的函数。临时字段的使用:为了实现复杂的转换,创建临时字段(如 accountsAccumulator)是一种常见且有效的策略。在转换完成后,记得清理这些临时字段以保持输出的整洁。路径表达式的灵活运用:@(1,fieldName) 这种路径表达式在 Jolt 中非常强大,它允许我们从当前操作的上下文向上或向下引用数据。可扩展性:如果 accounts 内部的结构发生变化,或者需要对其他类似的数值集合进行求和,只需要调整 shift 规则中的路径即可。

通过上述教程,我们详细了解了如何利用 Jolt 的 shift 和 modify-overwrite-beta 操作,高效地实现 JSON 对象中数值的聚合计算。掌握这些核心概念和技巧,将有助于您在数据处理中更灵活地运用 Jolt 进行复杂的 JSON 转换。

以上就是Jolt 数据转换:计算 JSON 对象中所有数值的总和的详细内容,更多请关注创想鸟其它相关文章!

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

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

相关推荐

发表回复

登录后才能评论
关注微信