当前位置:首页 > 文章列表 > 文章 > java教程 > Jolt数据转换:JSON数值求和与结构重塑技巧

Jolt数据转换:JSON数值求和与结构重塑技巧

2025-08-18 09:28:27 0浏览 收藏

本文详细介绍了如何利用Jolt进行JSON数据转换,实现嵌套对象中数值的求和,并将结果作为新字段添加到原始数据中,同时保留原始结构,适用于复杂JSON数据聚合与转换的场景。通过分步解析Jolt转换规范(Spec),展示了如何利用shift操作进行数据提取与重塑,以及modify-overwrite-beta操作执行数学计算。文章以一个具体的例子,详细讲解如何利用Jolt实现对JSON对象内部所有数值的求和,并将求和结果作为一个新字段添加到原始数据中。掌握Jolt的shift和modify-overwrite-beta操作,有助于处理更复杂的数据转换需求,使JSON数据处理变得更加灵活和高效,极大地提升您在数据集成和转换项目中的工作效率。

Jolt数据转换:实现JSON对象内数值求和与结构重塑

本教程详细阐述了如何使用Jolt进行JSON数据转换,以实现对嵌套对象中数值的求和操作,并将结果添加为新的字段,同时保留原始数据结构。文章通过分步解析Jolt转换规范(Spec),展示了如何利用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
}

注意事项

  1. 数据类型: intSum函数用于整数求和。如果您的数值可能包含小数,应使用doubleSum函数。
  2. 临时字段: 在Jolt转换中,创建临时字段(如本例中的accountsAccumulator)是实现复杂逻辑的常见模式。在转换的最后阶段,务必清理这些临时字段以保持输出的整洁。
  3. 路径表达式: @(1,accountsAccumulator)中的@(1,...)表示从当前节点向上回溯一级查找指定的字段。理解Jolt的路径表达式对于编写复杂的Spec至关重要。
  4. 健壮性: 本例假设accounts下的值都是数字。如果存在非数字值,intSum或doubleSum可能会忽略它们或导致错误,具体行为取决于Jolt版本和配置。在生产环境中,可能需要额外的步骤来验证或清洗数据。

总结

通过本教程,我们学习了如何利用Jolt的shift和modify-overwrite-beta操作,实现对JSON对象内部数值的求和,并将结果整合到新的字段中,同时保持原始数据的完整性。这种分阶段、模块化的Jolt Spec设计方法,有助于处理更复杂的数据转换需求,使JSON数据处理变得更加灵活和高效。掌握这些基本模式,将极大地提升您在数据集成和转换项目中的工作效率。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于文章的相关知识,也可关注golang学习网公众号。

CSS修复iOS滚动卡顿:-webkit-overflow-scrolling技巧CSS修复iOS滚动卡顿:-webkit-overflow-scrolling技巧
上一篇
CSS修复iOS滚动卡顿:-webkit-overflow-scrolling技巧
JS取数组最后n个元素的几种方法
下一篇
JS取数组最后n个元素的几种方法
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    511次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    498次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 千音漫语:智能声音创作助手,AI配音、音视频翻译一站搞定!
    千音漫语
    千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
    200次使用
  • MiniWork:智能高效AI工具平台,一站式工作学习效率解决方案
    MiniWork
    MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
    202次使用
  • NoCode (nocode.cn):零代码构建应用、网站、管理系统,降低开发门槛
    NoCode
    NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
    198次使用
  • 达医智影:阿里巴巴达摩院医疗AI影像早筛平台,CT一扫多筛癌症急慢病
    达医智影
    达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
    206次使用
  • 智慧芽Eureka:更懂技术创新的AI Agent平台,助力研发效率飞跃
    智慧芽Eureka
    智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
    221次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码